Обдумывать префиксную нотацию?

10

Я читаю о LISP.

Я понимаю, как работает префиксная нотация на определенном уровне, но мне было интересно, есть ли какие-нибудь хитрости, чтобы сделать ее интуитивно понятной.

Река Вивиан
источник
6
Вы имеете в виду помимо практики?
Пользователь RPL - мой любимый аромат LISP. У него даже нет скобок! ru.wikipedia.org/wiki/RPL_(programming_language) Мне не хватает моего HP 50g :-(
Робби
Сначала это казалось не интуитивным, но теперь я думаю, что это замечательно, и я в основном закончил читать. Это на самом деле, как мы говорим: «Сумма ..., продукт ...» Однако, это требует другого вида чтения. Теперь вы просто применяете оператор ко всем аргументам, а не читаете их в строке.
Марк С
Что не так с префиксной нотацией? Почти все языки используют его. Вызовы функций почти всегда префикс.
SK-logic
На самом деле, нет; «интуитивно» интуитивно понятно, потому что вы выучили его в форме математических соглашений более 20 лет. Так как только LISP и, возможно, несколько других языков используют это соглашение, и вы все равно будете изучать другой намного больше, оно вряд ли когда-нибудь станет таким же «интуитивным». И здесь мы говорим только о простых выражениях (2 + 3 ... как бы вы хотели использовать вкладку «полстраницы»? :)
Rook

Ответы:

6

Мысленно читайте его слева направо, так как разговорный язык с правильными глаголами может помочь. Например (+ 3 2) может быть «добавить три и два». В более общем случае вы можете сказать «выполнить операцию $ над $ операндами». Применительно к тому же случаю: «Выполнить операцию добавления на три и два».

Йорис Тиммерманс
источник
Что бы вы сделали с ( = 1 2 )и( > 4 2 )
Вивиан Ривер
3
Вы бы использовали риторические вопросы. :) Равный? (Что?), "1 и 2! (Эмм ... Нет ...)
Арафангион
@RiceFlour (Эй, я вырос на еде из рисовой муки - у меня проблема с глютеном.) Я бы прочитал «Один равен двум?» Или «Равны ли следующие?» Операторы «больше» и «меньше» не так естественны в префиксной форме, но мне интересно, как часто они используются в коде на Лиспе.
Марк С
7

Трюки? Зачем?

Это пока не кажется вам интуитивным, потому что ваш ментальный парсер к этому не привык. Будет лучше, если вы просто будете использовать его и читать его снова и снова.

сокол
источник
Я даже не читал , что много, но теперь я думаю , что это замечательно. Похоже, мой мозг начинает ощущать почти «тактильные» ощущения в скобках. Я думаю, что чувство станет только более острым.
Марк С
5

Вы можете думать об этом как о вызове функции:

(operator operand1 operand2 ...)

В этом нет ничего особенного. Если вы перегружаете операторы в C ++ (и многих других языках, которые позволяют это), вам часто приходится определять функции такого типа именно так:

MyClass operator+(MyClass const& x, MyClass const& y);
Торстен Мюллер
источник
Да, вот как я это делаю. Если вы отступите назад и посмотрите на вызовы методов в Java, C # и т. Д., То они на самом деле просто префиксная запись с круглыми скобками в немного другом месте: MyMethod (arg1, arg2).
Nlawalker
4

Многие языки используют сочетание префикса, инфикса и даже постфикса.

Лисп просто использует только префикс - по умолчанию. Если грех (х) интуитивно понятен из математики, то (грех х) не далеко. Если перемещение (собака, дом) - это традиционный вызов процедуры, то в Лиспе это просто (перемещение собаки домой).

Лисп не делает никаких исключений для математики и рассматривает +, -, * и другие как обычные вызовы функций.

Райнер Йосвиг
источник
2

Когда (в конце концов) щелкнуло «Все является вызовом функции» (или специальной формой, или макро-расширением, оба с поверхностным синтаксисом «вызова функции»), это показалось довольно естественным.

Итак, (= 1 2)я читаю это как 'вызовите сравнение чисел равно 1 и 2'.

Vatine
источник