В связи с критикой языка Ложбан, я задался вопросом: а нельзя ли придумать такой способ записи синтаксиса, в котором скобок было бы поменьше?
Например, выражение x=(a+b)*(c+d) содержит 13 символов. Да, скажете вы, можно же польскую нотацию: x a b + c d + * =, которая содержит всего лишь 9 символов. Первый вариант простой для восприятия, но длинный. Второй вариант короткий, но сложен для человеческого восприятия. И возник закономерный вопрос — нельзя ли придумать промежуточную систему, где скобок в два раза меньше? То есть в данном случае было бы 11 символов. Это был бы компромис между простотой и краткостью.
Немного подумав, предлагаю следующее решение: никакого приоритета операций нет, а они все жадные. Но зато можно после знака операций ставить запятую, которая говорит этой операции поумерить свой аппетит.
Например, a+b*c = (a+b)*c, так как жадный знак плюс сразу же связал b. А если мы хотим, чтобы стало a+(b*c) , то пишем так: a+,b*c.
Еще примеры
a+b*,c+d = (a+b)*(c+d)
sin x+y*z = (sin(x)+y)*z
sin x+,y*z = sin(x)+y*z
sin,x+y*z = sin(x+y)*z
sin,,x+y*z = sin((x+y)*z)
sin,x+,y*z = sin(x+y*z)
Это для вас легче по восприятию, чем польская нотация?
Это довольно легко воспринимается, по крайней мере пока операций мало. Наверно даже легче польской. А главное — меньше служебных слов.
Если Ложбан переделать под польскую, то станет коротко и не ясно. А если под татарскую — то станет ошутимо короче, но при этом более-менее ясно.
В польской было бы
* + a b + c d = (a+b)*(c+d)
* + sin x y z = (sin(x)+y)*z
+ sin x * y z = sin(x)+y*z
* sin + x y z = sin(x+y)*z
sin * +x y z = sin((x+y)*z)
sin + x * y z = sin(x+y*z)
То бишь в польской буквы на месте, но знаки операций скачут. А в татарской и буквы и знаки на своих местах, просто иногда запятые
Возьмем формулы E = mc2; Ж = (mc)2
Польская =E*m^c2; =Ж^*mc2
Татарская E=m,c2; Ж=mc2 — если знак "равно" традиционный. Ну а жадный знак равно надо писать в конец:
m,c2=E; mc2=Ж
Да, конечно, выражения вида (a+b+c+d)(t+x+y+z) выглядят не очень:
a+b+c+d*,,,t+x+y+z.
В таких случаях, когда запятых больше двух подряд, имеет смысл юзать скобки.
(a+b(c+d))(t+x+y+z) = a+,b,c+d(t+x+y+z) — экономия двух символов.
Да, вроде мы использовали скобки, но это ничего. Самое главное, что теперь не нужно изучать приоритеты операций, все становится очевидно. Никаких приоритетов, все операции выполняются сразу, если нет запятых.
А та традиционная система, которую все используют —очень непоследовательна, случайна и мультипарадигменная. Поэтому так сложно писать для нее парсер.
А предлагаемую мной систему можно, исходя из смысла запятых, назвать "паузальная нотация". И тогда операции лучше называть не "жадные", а "торопливые".
Цитата: kemerover от августа 17, 2022, 08:56Это для вас легче по восприятию, чем польская нотация?
Когда вводится что-то новое, то трудно поначалу отличить объективное неудобство от непривычки. После практики, когда привыкаешь к новому, становится ясно, какая система лучше.
Уравнение сферы с центром в точке (a, b, c) в традиционной нотации:
(x-a)2+(y-b)2+(z-c)2 = R2
А вот в паузальной:
x-a2+,,y-b2+,,z-c2 =, R2 — экономия один символ
Квадратное уравнение:
ax2+bx+c=0
x=(-b+-sqrt(b2-4ac))/(2a)
Соответственно:
x2a+,bx+c=0
x=b2-,,4ac+-sqrt-b/,2a
Цитата: maratique от августа 17, 2022, 08:28sin,x+y*z = sin(x+y)*z
sin,,x+y*z = sin((x+y)*z)
Я бы сделал работу запятой немного по-другому. Т.е., по умолчанию все операции имеют приоритет 0 (самые приоритетные), каждая запятая после них опускает приоритет на единицу. При вычислении, сначала выполняются наиболее приоритетные операци с приоритетом 0, затем — с приоритетом 1, и т.д. Тогда:
sin,x+y*z =
sin((x+y)*z)sin,x+y*,z =
sin(x+y)*zsin,,x+,y*z =
sin(x+y*z)Возможно, имеет смысл не только опускать приоритет, но и поднимать его (обозначим подъем апострофом):
sin x+'y*z =
sin(x+y)*z
Цитата: Python от ноября 5, 2022, 09:02по умолчанию все операции имеют приоритет 0 (самые приоритетные), каждая запятая после них опускает приоритет на единицу. При вычислении, сначала выполняются наиболее приоритетные операци с приоритетом 0, затем — с приоритетом 1
:???
Приоритет — величина отрицательная?
Цитата: Bhudh от ноября 5, 2022, 09:50Цитата: Python от ноября 5, 2022, 09:02по умолчанию все операции имеют приоритет 0 (самые приоритетные), каждая запятая после них опускает приоритет на единицу. При вычислении, сначала выполняются наиболее приоритетные операци с приоритетом 0, затем — с приоритетом 1
:???
Приоритет — величина отрицательная?
В данном случае — да. По аналогии с «в первую очередь», «во вторую очередь» и т.д. Или «на первом месте», «на втором месте».
Две скобки (открывающая и закрывающая) нужны не всегда, часто достаточно одной из них. Например,
a+b)*c
a+(b*c
a+b)*(c+d
sinx)+y)*z
sinx)+(y*z
sin(x+y)*z
sin((x+y)*z
sin(x+y*z.
Кстати, знак "горизонтальная черта", над которой пишется выражение-делимое, а под ней - выражение-делитель, будет означать )/( в такой нотации.
Квадратное уравнение:
a*(x^2)+(b*x)+c=0
x1, 2=-b+-sqrtb^2-(4*a*c)/(2*a
ЦитироватьКстати, знак "горизонтальная черта", над которой пишется выражение-делимое, а под ней - выражение-делитель, будет означать )/( в такой нотации.
Тогда чтобы просто написать
1/2 надо будет писать
(1/2)
ЦитироватьВозможно, имеет смысл не только опускать приоритет, но и поднимать его (обозначим подъем апострофом):
sin x+'y*z = sin(x+y)*z
Можно просто запятую ставить
перед, а не после знака операции. В любом случае такую возможность надо использовать с пользой. Например вместо скобок
ОП, ознакомьтесь https://toaq.net/ . Serial predicates похожи на татарские цепочки из деепричастий.
Цитата: maratique от августа 17, 2022, 16:40a+b+c+d*,,,t+x+y+z
Вместо запятой можно использовать более различимый символ, например японскую точку:
a+b+c+d*。。。t+x+y+z
Или например квадратик:
a+b+c+d*▪▪▪t+x+y+z
。можно спутать с символом композиции функций ∘.
А квадратик просто неудобно быстро писать от руки.
Главное что парсер лёгкий для программирования.
Но вообще-то изначально я хотел таким образом ложбан упростить, добавив слово-запятую, чтобы было поменьше скобок
Цитата: maratique от ноября 6, 2022, 16:01Главное что парсер лёгкий для программирования.
Парсеру вообще пофиг, какие там символы и их комбинации.
Whitespace (https://en.wikipedia.org/wiki/Whitespace_(programming_language)) не даст соврать.
Цитата: maratique от ноября 6, 2022, 16:01Главное что парсер лёгкий для программирования.
Вы на стороне людей или на стороне машин?
Для простого стекового языка программирования достаточно:
- Присваивание
- Польская нотация
- Массивы
- Если
- goto
- read/write
(получится польский фортран-66)
И все это парсить чуть ли не легче, чем просто математические выражения в традиционной нотации.
Цитата: Bhudh от ноября 6, 2022, 15:31。можно спутать с символом композиции функций ∘.
А квадратик просто неудобно быстро писать от руки.
Последний раз я писал код от руки в 2004 году.
В принципе если кому-то зверски необходимо написать код от руки и потом днями и ночами переписывать его в среду разработки, вместо квадратика может использовать на бумаге знак пробела, который как перевёрнутая "п", этот знак почти забыт человечеством, а потому свободен.
Также рекомендую ОПу ознакомиться с системой приоритетов инфиксных операторов в Haskell'е. Это ещё один способ уменьшить число скобок. Глядя на все эти запятые именно Haskell приходит на ум.
Наверное, я не первый кто это заметил, но если по традиции обозначать отрицательные числа как
-x, то и обратные числа будьте любезны обозначать
/x:
Цитата: maratique от ноября 22, 2022, 06:54то и обратные числа будьте любезны обозначать /x
B APL примерно так и сделали: А÷В — деление, ÷A — обратная величина.
Цитата: maratique от ноября 22, 2022, 06:54Наверное, я не первый кто это заметил, но если по традиции обозначать отрицательные числа как -x, то и обратные числа будьте любезны обозначать /x:
В некоторых языках программирования вместо
0.5 можно писать просто
.5
Во всех С-подобных, емнип. В JavaScript, например.