Мне трудно это понять, но вы имеете в виду, что:
x == a | b
будет синтаксическим сахаром, эквивалентным:
(x == a) || (x == b)
В сообщении блога вы приводите этот пример:
1 + (2|3)
Таким образом, тип этого выражения представляет собой пару целых чисел со значениями 3 и 4, каждое из которых представляет одно из возможных значений. Таким образом, мы также можем сказать:
4 == (1 + (2|3)
3 == (1 + (2|3)
и оба они оценили бы как истину. Таким образом, оператор ==
может сравнивать значение с видом вектора значений и будет true
, если любое из значений в векторе равно первому значению.
Это может быть реализовано с использованием перегрузки операторов на нескольких языках (хотя вам придется явно "поднять" простые значения в тип-оболочку, прежде чем вы сможете с ними работать).
Разве это не то же самое, что объединение двух множеств, а с == интерпретируется как "является членом"? А операторам нравится, когда + отменяется, поэтому они применяются ко всем членам набора.
И если бы вы сделали (1 | 2) + (4 | 8), вы бы получили эквивалент (5 | 9 | 6 | 10), потому что это четыре возможных результата.
Хорошо, из дополнительных примеров, которые вы добавили, я вижу, что ==
фактически требует, чтобы левая и правая стороны были одинаковыми, а не просто перекрывались. Но у меня все еще складывается впечатление, что ваш |
- это просто объединение двух комплектов. То, что это влечет за собой (или означает), будет зависеть от того, что вы делаете со всеми другими функциями вашего языка для работы с наборами.
Относительно вашего заявления:
язык полностью отделен
из концепции "время"
Много ли вы смотрели на чисто функциональные языки, такие как Haskell? Программы представляют собой серию определений без известного порядка выполнения, вы можете писать только чистые функции без побочных эффектов, и, следовательно, интерпретатор может упорядочивать выполнение, как ему угодно, если значения доступны, когда это действительно необходимо.
Обновление:
Вы добавили это в свой вопрос:
if(x == a | b) {
// this
}
// can be written as
if((x == a) | (x == b)) {
// this
}
// which can be written as
if(x == a) {
// this
}
if(x == b) {
// with this
}
Интересно, как вы думаете, что это будет освещать!
Дело в том, что первые две версии имеют один блок кода под if. Таким образом, если третья расширенная версия имеет два блока, они должны быть одинаковыми . Другими словами, это просто еще один способ написания:
if (x == a || x == b) {
// this
}
Где || это традиционное логическое ИЛИ Именно этот вопрос я и задал.
Хорошо, еще раз ... Вы изменили синтаксис, чтобы указать, что вы делаете объединения и пересечения. Но тогда:
if(userkey I ("shift" U "a")) {
// pressed both "shift" and the "a" key.
То есть I
означает пересечение двух множеств ... но при каких обстоятельствах if
выполняет блок кода? Если пересечение не пусто? Или I
на самом деле спрашивает "все ли члены набора справа члены набора слева" И есть подсказки, что userkey
заменяется в области видимости блока другим значением, которое на самом деле просто установить справа.
Я иду спать.