[英]How to pass operators in expressions in elisp?
我正在閱讀Lisp的根目錄 ,並遇到以下示例:
(
(lambda (f) (f '(b c)))
'(lambda (x) (cons 'a x)))
但是,如果我在Emacs
對其進行了評估,
Symbol's function definition is void: f
如果我在https://repl.it/languages/scheme上嘗試,它使用Schema作為Lisp解釋器,我得到了
Error: ('lambda ('x) ('cons ('quote 'a) 'x)) is not a function [(anon), (anon)]
如果刪除第二個lambda表達式上的quote
,則此示例在repl.it上有效,但在Emacs上仍然出現相同的錯誤。
將函數f
應用於'(bc)
必須使用funcall
完成。 因此,以下工作:
(
(lambda (f) (funcall f '(b c)))
'(lambda (x) (cons 'a x)))
並計算為(abc)
。
Paul Graham可能在他的文章中使用了lisp的某種變體,其中只有一個名稱空間用於函數名稱和數據變量( Lisp-1或Scheme模型),而Elisp是一種Lisp-2語言,具有用於函數/變量的不同命名空間。 這樣可以使函數和變量具有相同的名稱。
所以對於像
(some-function some arguments)
elisp執行程序僅在函數名稱空間中搜索some-function
,當您要從變量名稱空間調用與變量關聯some-function
,該函數會使諸如funcall
的結構或apply
必需。
如果不理解,elisp中單獨的函數/變量名稱空間可能會導致意外行為:
(defun do-something () (1))
(setq do-something #'(lambda () (2)))
(do-something) ;; => 1
(funcall do-something) ;; => 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.