2012-10-16 7 views

Odpowiedz

12

W tych Lisps, które mają pojedynczy obszar nazw dla zmiennych i funkcji, wyrażenie jest prawidłowe. Są to nazywane Lisp-1. Scheme i Clojure są przykładami takich Lisps.

W tych Lisps, które mają oddzielne przestrzenie nazw dla zmiennych i funkcji, twoje wyrażenie będzie (funcall (f 2) 3 4). Są to nazywane Lisp-2. Wspólne Lisp i Emacs Lisp są przykładami takich Lisps.

W Lisp-2, co każdy symbol ma szczelinę wartość oraz szczelinę funkcji. Aby wywołać funkcję zapisaną w gnieździe wartości , należy użyć funcall keyword.

Zobacz więcej na ten temat: http://www.dreamsongs.com/Separation.html

EDIT: Dzięki Rainer Joswig poprawiłam odpowiedź.

+0

przykładem jest teraz w porządku. Wyjaśnienie nie tak naprawdę. Slot symboli to tylko połowa problemu. "Lisp-2" ma dwie przestrzenie nazw. Wartości nie są przechowywane w gniazdach. Wartości są wynikiem oceny wyrażeń. (let ((a (lambda() "hi))) (funcall a)) W tym przykładzie w Common Lisp nie ma żadnej" wartości symbolu ". Jest to odnośnik zmiennej leksykalnej. To nie jest dostęp do wartości symbolu. Symbol jest tylko artefaktem kodu źródłowego, ale nie faktycznym wykonaniem. –

+0

Myślę, że powinieneś nieco zmienić treść drugiego akapitu. Być może zaczynając od "In Lisp-2s, z drugiej strony istnieją oddzielne przestrzenie nazw ..." Początkowo wpadłem w zakłopotanie, ponieważ myślałem, że w drugim akapicie wciąż mówisz o Lisp-1. Niemniej jednak, zaakceptowany. – spacingissue

5

Na przykład w Common Lisp powyżej jest niepoprawny. Składnia Common Lisp zazwyczaj nie zezwala na listy jako nagłówek wywołania funkcji. Musisz użyć numeru FUNCALL, aby wywołać zwróconą wartość funkcji.

(funcall (f 2) 3 4) 

W niektórych innych dialektach Lisp jest to dozwolone. Schemat to taki dialekt Lispa. Schemat ocenia również nagłówek wyrażenia wywołania funkcji.

+1

Chciałbym móc przyjąć wiele odpowiedzi. Dziękuję Ci! – spacingissue

1

Lisp-1 sepsy, takie jak Schematy, zwykle mają wszystkie wyrażenia funkcji, które są oceniane, nawet sama funkcja.

Lisp-2 lisps, takie jak Common Lisp, zwykle mają różne zachowanie dla funkcji i argumentów. Podczas gdy argumenty są oceniane, funkcja jest sprawdzana. Najczęstszym sposobem wywołania funkcji oceny jest użycie funcall lub apply.

(funcall (f 2) 3 4) 

W Common Lisp, można użyć lambda form, jeśli nalegać na coś do oceny funkcji w operatorze:

((lambda (&rest args) (apply (f 2) args)) 3 4) 
Powiązane problemy