Конкатенативные языки обладают некоторыми очень интригующими характеристиками, такими как способность составлять функции разной степени сложности и возможность выделять любой раздел функции.Тем не менее, многие люди увольняют их из-за использования постфиксной нотации и сложности чтения.Кроме того, польские, вероятно, не ценят людей, использующих свои тщательно разработанные обозначения задом наперед.
Итак, возможно ли иметь префиксную запись?Если это так, какие будут компромиссы?
У меня есть представление о том, как это может работать, но у меня нет опыта работы с конкатенационными языками, поэтому я, вероятно, что-то упускаю.По сути, функция будет оцениваться в обратном порядке, а значения будут извлекаться из стека в обратном порядке.Чтобы продемонстрировать это, я сравним постфикс с тем, как будет выглядеть префикс.Вот некоторые конкатенативные выражения с традиционной постфиксной нотацией.
5 dup * ! Multiply 5 by itself
3 2 - ! Subtract 2 from 3
(1, 2, 3, 4, 5) [2 >] filter length ! Get the number of integers from 1 to 5
! that are greater than 2
Выражения вычисляются слева направо: в первом примере 5
помещается в стек, затем dup
дублирует верхнюю частьзначение в стеке, то *
умножает два верхних значения в стеке.Функции извлекают свой последний аргумент первым из стека: во втором примере, когда вызывается -
, 2
находится на вершине стека, но это последний аргумент.
Вот что ядумаю, что префиксная нотация будет выглядеть так:
* dup 5
- 3 2
length filter (1, 2, 3, 4, 5) [< 2]
Выражения вычисляются справа налево, и функции извлекают первый аргумент из стека.Обратите внимание, что пример фильтра префиксов читается гораздо ближе к его описанию и выглядит как аппликативный стиль.Одна проблема, которую я заметил, состоит в том, что факторизация вещей может быть не такой полезной.Например, в постфиксной нотации вы можете выделить 2 -
из 3 2 -
, чтобы создать функцию subtractTwo.В префиксной нотации вы можете выделить - 3
из - 3 2
, чтобы создать функцию subtractFromThree, которая не выглядит столь же полезной.
Запрещение любых явных проблем, возможно, конкатенирующий язык, использующий префиксную нотацию, может победитьлюди, которые не любят постфиксную запись.Любое понимание приветствуется.