Обертаючи свою думку навколо позначень префікса?


10

Я читаю про LISP.

Я розумію, як нотація префікса працює на певному рівні, але мені було цікаво, чи є хитрощі, щоб зробити його інтуїтивно зрозумілим.


6
Крім практики, ви маєте на увазі?

Користувач RPL - це мій улюблений смак LISP. У нього навіть немає дужок! en.wikipedia.org/wiki/RPL_(programming_language) Я пропускаю використання свого HP 50g :-(
Роббі

Спочатку це здавалося неінтуїтивним, але зараз я думаю, що це чудово, і я здебільшого займався читанням. Це насправді, як ми говоримо: "Сума ..., добуток ..." Однак для читання потрібен різний вид. Тепер ви просто застосуєте оператор до всіх аргументів, а не читайте їх у рядку.
Марк C

Що не так із позначенням префікса? Практично всі мови користуються ним. Функціональні дзвінки майже завжди є префіксом.
SK-логіка

Не зовсім; "інтуїтивно зрозумілий" інтуїтивно зрозумілий, тому що ви засвоїли це у формі математичних умовностей за> 20+ років. Оскільки лише LISP та, можливо, кілька інших мов використовують цю конвенцію, а ви все ще вивчите іншу набагато більше, вона навряд чи колись стане однаково «інтуїтивно зрозумілою». І ми говоримо тут лише про прості вирази (2 + 3 ... як би ви хотіли спробувати вкладиш на півсторінки? :)
Rook

Відповіді:


6

Подумки читання його зліва направо, оскільки розмовна мова з належними дієсловами може допомогти. Наприклад (+ 3 2) може бути "додати три і два". У більш загальному випадку можна сказати "виконувати $ операцію на $ операндах". Застосовується до того ж випадку: "Виконайте операцію додавання на три та дві".


Що б ви зробили з ( = 1 2 )і( > 4 2 )
Вівіан Рівер

3
Ви б використовували риторичні питання. :) Рівно? (Що?), "1 і 2! (Ем ... Ні ...)
Арафангіон

@RiceFlour (Гей, я виріс, їв речі, зроблені з рисового борошна - у мене проблема з глютеном.) Я прочитав би "Чи дорівнює один двом?", Або "Чи такі рівні?" Оператори з більшою та меншою мірою, ніж у префіксах, не такі природні, але мені цікаво, як часто вони використовуються в коді Lisp.
Марк C

7

Витівки? Для чого?

Це не відчуває для вас інтуїтивно зрозуміло, тому що ваш розумовий аналізатор до цього не звик. Це стане краще, якщо ви просто використовуєте його і читатимете його знову і знову.


Я навіть не читав , що багато, але тепер я думаю , що це чудово. Здається, мій мозок починає мати майже «тактильне» розуміння дужок. Я думаю, що почуття лише стануть більш гострими.
Марк C

5

Ви можете подумати про це як про якийсь виклик функції:

(operator operand1 operand2 ...)

У цьому немає нічого особливого. Якщо ви перевантажуєте операторів на C ++ (та багатьох інших мовах, які це дозволяють), вам часто доводиться визначати такий тип функції саме таким чином:

MyClass operator+(MyClass const& x, MyClass const& y);

Так, це я роблю. Якщо ви відступили назад і подивилися на виклики методів у Java, C # тощо, вони насправді є лише позначенням префіксів у дужках у дещо іншому місці: MyMethod (arg1, arg2).
nlawalker

4

Багато мов використовують суміш префікса, інфіксації та навіть постфікса.

Lisp просто використовує лише префікс - за замовчуванням. Якщо sin (x) інтуїтивно зрозумілий з математики, то (sin x) не за горами. Якщо переїзд (собака, додому) - це традиційний виклик процедури, то в Ліспі це просто (переміщення собаки додому).

Lisp не робить жодного винятку для математики та лікує +, -, * та інші, як звичайні виклики функцій.


2

Коли (зрештою) "Все - це виклик функції" (або спеціальна форма, або макророзширення, обидва з поверхневим синтаксисом "виклик функції") натиснули, це почувалося досить природно.

Отже, (= 1 2)я читав, що як "виклик числових дорівнює порівнянню на 1 і 2".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.