2010-04-28 12 views
7

Jaki jest minimalny zestaw elementów pierwotnych wymaganych, aby język był kompletny i wariant seplenienia?Naprawdę minimum seplenienie

Wygląda na to, że samochód, cdr i trochę kontroli przepływu i coś dla REPL jest wystarczające. Fajnie byłoby, gdyby taka lista była.

Zakłada się, że są tylko trzy typy danych, liczb, symboli i list. (Jak w picolisp)

+0

Należy pamiętać, że liczby całkowite są niepotrzebne, można je zaimplementować z czystych funkcji. – celtschk

Odpowiedz

5

Jest dobra dyskusja na ten temat w Lisp FAQ. To zależy od wyboru prymitywów. Oryginalna "Instrukcja programowania programatora LISP 1.5" autorstwa McCarthy wykonała pięć funkcji: CAR, CDR, CONS, EQ i ATOM.

+2

Czytając wymienione FAQ, wygląda na to, że użył tych pięciu funkcji wraz ze specjalnymi formularzami: CONS, LAMBDA i QUOTE. – Zak

12

lambda calculus jest ryzacji zakończona. Ma jeden prymityw - lambda. Tłumaczenie tego na składnię seplenienia jest dość trywialne.

+0

W rzeczywistości ma * trzy * prymitywy: wyrażenia lambda, wywołania funkcji i odwołania zmiennych. –

1

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.