Zawijasz mnie wokół notacji przedrostków?

10

Czytam o LISP.

Rozumiem, jak działa notacja prefiksowa na pewnym poziomie, ale zastanawiałem się, czy są jakieś sztuczki, aby uczynić ją intuicyjną.

Vivian River
źródło
6
Masz na myśli oprócz ćwiczeń?
Użytkownik RPL jest zdecydowanie moim ulubionym smakiem LISP. Nie ma nawet nawiasów! en.wikipedia.org/wiki/RPL_(programming_language) Tęsknię za użyciem mojego HP 50g :-(
Robbie
Na początku wydawało się to nieintuicyjne, ale teraz uważam, że jest cudowne, i czytałem głównie. Tak właśnie mówimy: „Suma…, iloczyn…” Wymaga to jednak innego rodzaju czytania. Teraz po prostu zastosuj operator do wszystkich argumentów, zamiast czytać je w linii.
Mark C
Co jest nie tak z notacją przedrostka? Korzystają z niego prawie wszystkie języki. Wywołania funkcji są prawie zawsze prefiksami.
SK-logic
Nie całkiem; „intuicyjny” jest intuicyjny, ponieważ nauczyłeś się go w formie matematycznych konwencji od ponad 20 lat. Ponieważ tylko LISP i być może kilka innych języków korzysta z tej konwencji, a nadal będziesz uczyć się znacznie więcej, prawie nigdy nie stanie się on równie „intuicyjny”. I mówimy tu tylko o prostych wyrażeniach (2 + 3 ... jak chciałbyś wypróbować linijkę „pół strony”?)
Rook

Odpowiedzi:

6

Pomocne może być czytanie mentalne od lewej do prawej jako język mówiony z odpowiednimi czasownikami. Na przykład (+ 3 2) może oznaczać „dodaj trzy i dwa”. W bardziej ogólnym przypadku możesz powiedzieć „wykonaj operację $ na operandach $”. Zastosowano w tym samym przypadku: „Wykonaj operację dodawania dla trzech i dwóch”.

Joris Timmermans
źródło
Co byś zrobił z ( = 1 2 )i( > 4 2 )
Vivian River
3
Używałbyś retorycznych pytań. :) Równy? (Co?), „1 i 2! (Ehm ... Nie ...)
Arafangion
@RiceFlour (Hej, dorastałem jedząc rzeczy zrobione z mąki ryżowej - mam problem z glutenem). Czytałbym: „Czy jeden równa się dwa?” Lub „Czy następujące są równe?” Operatory większe niż i mniejsze niż nie są tak naturalne w formie prefiksu, ale zastanawiam się, jak często są używane w kodzie Lisp.
Mark C
7

Wydziwianie? Po co?

Nie wydaje ci się to intuicyjne, ponieważ parser mentalny nie jest do tego przyzwyczajony. Będzie lepiej, jeśli będziesz go używać i czytać w kółko.

Sokół
źródło
I nawet nie czytać , że wiele z nich, ale teraz myślę, że to jest wspaniałe. Wygląda na to, że mój mózg zaczyna mieć niemal „dotykowe” wyczucie nawiasów. Myślę, że to uczucie stanie się bardziej żywe.
Mark C
5

Możesz myśleć o tym jako o rodzaju wywołania funkcji:

(operator operand1 operand2 ...)

Nie ma w tym nic specjalnego. Jeśli przeciążasz operatorów w C ++ (i wielu innych językach, które na to pozwalają), często musisz dokładnie zdefiniować ten rodzaj funkcji:

MyClass operator+(MyClass const& x, MyClass const& y);
Thorsten Müller
źródło
Tak, tak to robię. Jeśli cofniesz się i spojrzysz na wywołania metod w Javie, C # itp., To tak naprawdę to tylko przedrostek notacji z nawiasami w nieco innym miejscu: MyMethod (arg1, arg2).
nlawalker
4

Wiele języków używa kombinacji przedrostka, przyrostka, a nawet postfiksa.

Lisp używa tylko prefiksu - domyślnie. Jeśli sin (x) jest intuicyjny w matematyce, to (sin x) nie jest daleko. Jeśli przeprowadzka (pies, dom) jest tradycyjnym wezwaniem na zabieg, to w Lisp jest to po prostu (przeprowadzka pies do domu).

Lisp nie robi żadnego wyjątku dla matematyki i traktuje +, -, * i inne jak zwykłe wywołania funkcji.

Rainer Joswig
źródło
2

Kiedy (w końcu) „Wszystko jest wywołaniem funkcji” (lub specjalną formą lub makropoleceniem, oba mają składnię powierzchniową „wywołania funkcji”), wydawało się to całkiem naturalne.

Dlatego (= 1 2)czytam to jako „wywołanie porównania równości numerycznej na 1 i 2”.

Vatine
źródło