Я понимаю, как работает префиксная нотация на определенном уровне, но мне было интересно, есть ли какие-нибудь хитрости, чтобы сделать ее интуитивно понятной.
Сначала это казалось не интуитивным, но теперь я думаю, что это замечательно, и я в основном закончил читать. Это на самом деле, как мы говорим: «Сумма ..., продукт ...» Однако, это требует другого вида чтения. Теперь вы просто применяете оператор ко всем аргументам, а не читаете их в строке.
Марк С
Что не так с префиксной нотацией? Почти все языки используют его. Вызовы функций почти всегда префикс.
SK-logic
На самом деле, нет; «интуитивно» интуитивно понятно, потому что вы выучили его в форме математических соглашений более 20 лет. Так как только LISP и, возможно, несколько других языков используют это соглашение, и вы все равно будете изучать другой намного больше, оно вряд ли когда-нибудь станет таким же «интуитивным». И здесь мы говорим только о простых выражениях (2 + 3 ... как бы вы хотели использовать вкладку «полстраницы»? :)
Rook
Ответы:
6
Мысленно читайте его слева направо, так как разговорный язык с правильными глаголами может помочь. Например (+ 3 2) может быть «добавить три и два». В более общем случае вы можете сказать «выполнить операцию $ над $ операндами». Применительно к тому же случаю: «Выполнить операцию добавления на три и два».
Вы бы использовали риторические вопросы. :) Равный? (Что?), "1 и 2! (Эмм ... Нет ...)
Арафангион
@RiceFlour (Эй, я вырос на еде из рисовой муки - у меня проблема с глютеном.) Я бы прочитал «Один равен двум?» Или «Равны ли следующие?» Операторы «больше» и «меньше» не так естественны в префиксной форме, но мне интересно, как часто они используются в коде на Лиспе.
Марк С
7
Трюки? Зачем?
Это пока не кажется вам интуитивным, потому что ваш ментальный парсер к этому не привык. Будет лучше, если вы просто будете использовать его и читать его снова и снова.
Я даже не читал , что много, но теперь я думаю , что это замечательно. Похоже, мой мозг начинает ощущать почти «тактильные» ощущения в скобках. Я думаю, что чувство станет только более острым.
Марк С
5
Вы можете думать об этом как о вызове функции:
(operator operand1 operand2 ...)
В этом нет ничего особенного. Если вы перегружаете операторы в C ++ (и многих других языках, которые позволяют это), вам часто приходится определять функции такого типа именно так:
Да, вот как я это делаю. Если вы отступите назад и посмотрите на вызовы методов в Java, C # и т. Д., То они на самом деле просто префиксная запись с круглыми скобками в немного другом месте: MyMethod (arg1, arg2).
Nlawalker
4
Многие языки используют сочетание префикса, инфикса и даже постфикса.
Лисп просто использует только префикс - по умолчанию. Если грех (х) интуитивно понятен из математики, то (грех х) не далеко. Если перемещение (собака, дом) - это традиционный вызов процедуры, то в Лиспе это просто (перемещение собаки домой).
Лисп не делает никаких исключений для математики и рассматривает +, -, * и другие как обычные вызовы функций.
Когда (в конце концов) щелкнуло «Все является вызовом функции» (или специальной формой, или макро-расширением, оба с поверхностным синтаксисом «вызова функции»), это показалось довольно естественным.
Итак, (= 1 2)я читаю это как 'вызовите сравнение чисел равно 1 и 2'.
Ответы:
Мысленно читайте его слева направо, так как разговорный язык с правильными глаголами может помочь. Например (+ 3 2) может быть «добавить три и два». В более общем случае вы можете сказать «выполнить операцию $ над $ операндами». Применительно к тому же случаю: «Выполнить операцию добавления на три и два».
источник
( = 1 2 )
и( > 4 2 )
Трюки? Зачем?
Это пока не кажется вам интуитивным, потому что ваш ментальный парсер к этому не привык. Будет лучше, если вы просто будете использовать его и читать его снова и снова.
источник
Вы можете думать об этом как о вызове функции:
В этом нет ничего особенного. Если вы перегружаете операторы в C ++ (и многих других языках, которые позволяют это), вам часто приходится определять функции такого типа именно так:
источник
Многие языки используют сочетание префикса, инфикса и даже постфикса.
Лисп просто использует только префикс - по умолчанию. Если грех (х) интуитивно понятен из математики, то (грех х) не далеко. Если перемещение (собака, дом) - это традиционный вызов процедуры, то в Лиспе это просто (перемещение собаки домой).
Лисп не делает никаких исключений для математики и рассматривает +, -, * и другие как обычные вызовы функций.
источник
Когда (в конце концов) щелкнуло «Все является вызовом функции» (или специальной формой, или макро-расширением, оба с поверхностным синтаксисом «вызова функции»), это показалось довольно естественным.
Итак,
(= 1 2)
я читаю это как 'вызовите сравнение чисел равно 1 и 2'.источник