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ą.


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”.


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.


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);

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.


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”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.