Najlepszym sposobem, aby to wiedzieć na pewno, jest wdrożenie go. Użyłem 3 lata, aby utworzyć Zozotez, który jest McCarty-ish LISP uruchomiony na Brainfuck.
Próbowałem dowiedzieć się, czego potrzebowałem i na forum znajdziesz wątek, który mówi: You only need lambda. W ten sposób możesz utworzyć cały LISP w rachunku lambda, jeśli chcesz. Znalazłem to interesujące, ale nie jest to najlepszy sposób, jeśli chcesz czegoś, co w końcu ma efekty uboczne i działa w prawdziwym świecie.
Dla Turinga pełnej LISP użyłem Paul Grahams explanation of McCarthy's paper i wszystko, czego naprawdę potrzebujesz to:
- symbolu ocena
- szczególną formą cytat
- specjalny formularz, jeśli (lub dyr)
- forma specjalny lambda (podobne do oferty)
- funkcja eq
- funkcja atom
- funkcyjne minusy
- funkcja samochodowe
- funkcja cdr
- funkcyjnego-wysyłki (w zasadzie stosuje ale nie faktycznie wystawiony do systemu więc obsługuje listę, w której pierwszy element jest funkcją)
Ów 10. na dodatek do tego, aby mieć realizacji, które można przetestować, a nie tylko na desce kreślarskiej:
- funkcja odczytu
- funkcja write
To jest 12.W moim Zozotez zaimplementowałem również set
i flambda
(anonimowe makra, takie jak lambda). Mogłabym go przekazać do biblioteki implementującej dynamiczne seplenienie (Elisp, picoLisp) z wyjątkiem pliku I/O (ponieważ bazowy BF nie obsługuje go inaczej niż stdin/stdout).
Polecam każdemu wdrożenie interpretera LISP1, zarówno w LISP
i (not LISP)
, aby w pełni zrozumieć, w jaki sposób język jest zaimplementowany. LISP ma bardzo prostą składnię, więc jest to dobry punkt wyjścia. W przypadku wszystkich innych języków programowania sposób implementacji interpretera jest bardzo podobny. Na przykład. w kreatorze SICP videos tworzą tłumacza dla języka logicznego, ale struktura i sposób jego implementacji jest bardzo podobna do interpretatora selekcji, mimo że ten język jest zupełnie inny niż Lisp.
Należy pamiętać, że liczby całkowite są niepotrzebne, można je zaimplementować z czystych funkcji. – celtschk