Po co cytować pojedynczy argument i przecinek? (cytat, arg)
15
(quote x)marki nie X będzie oceniana, ale dodanie ,przed xwewnątrz quotesprawia, że oceniany. Co to jest to punkt korzystania cytat z pojedynczym argumentem przecinkiem przed nim tak: (quote ,x)?
Przecinek jest używany w kontekście backquoted (aka quasiquoted) listy, co pozwala ocenić pewne fragmenty listy wybiórczo. Zobacz także ten wątek, aby zobaczyć przykład zastosowania cofania cudzysłowu.
Kilka prostych przykładów:
(setq a "a's value" b "b's value" c "c's value")
'(a b c) ; => (a b c)
`(,a b ,c) ; => ("a's value" b "c's value")
Okej, więc cytat przed prognoznacza, że musisz umieścić przecinek przed rzeczami, które chcesz ocenić, bez względu na to, jak daleko są zagnieżdżone? ( ,cmdJest na innej liście, a nie bezpośrednio w (progn)
środku
To dobra okazja do przetestowania tego! Spróbuj ocenić, (setq a "a's value" b "b's value" c "c's value")a następnie oceń `(a '(,b c)).
Dan
Inne nowości: aby ocenić, dodaj tekst do bufora scratch, następnie umieść kursor na końcu linii, a następnie naciśnij Cxe.
The Unfun Cat
11
To dlatego, że jest w makrze. Makro musi zwrócić formularz Lisp, który z kolei podlega ocenie.
Na przykład, patrząc na pierwsze wywołanie tego makra:
progn
oznacza, że musisz umieścić przecinek przed rzeczami, które chcesz ocenić, bez względu na to, jak daleko są zagnieżdżone? (,cmd
Jest na innej liście, a nie bezpośrednio w(progn)
(setq a "a's value" b "b's value" c "c's value")
a następnie oceń`(a '(,b c))
.To dlatego, że jest w makrze. Makro musi zwrócić formularz Lisp, który z kolei podlega ocenie.
Na przykład, patrząc na pierwsze wywołanie tego makra:
Potrzebujemy rozszerzenia zawierającego:
co
(quote ,cmd)
osiąga. Jeśli makro użyłobycmd
zamiast tego zwykłego , byłoby trzymane dosłownie, a rozwinięcie wyglądałoby następująco:co jest błędem, ponieważ
cmd
nie jest zdefiniowane w środowisku, w którym makro jest wywoływane.źródło