亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 5952 | 回復(fù): 6
打印 上一主題 下一主題

-[?]-- Lisp 的 lambda 表達(dá)式 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-02-17 14:16 |只看該作者 |倒序?yàn)g覽
Lisp 的 lambda 表達(dá)式,有個(gè)地方想不清楚。 我用的解釋器是 clisp。


在  Common Lisp 中,用 defun 定義的函數(shù)有一個(gè)函數(shù)名和一個(gè)函數(shù)對(duì)象。

(defun f (x) x) 生成了一個(gè)函數(shù)對(duì)象,它的名字叫 f。用 #'f 可以獲取 f 關(guān)聯(lián)的函數(shù)對(duì)象。


  1. [1]> (defun f (x) x)
  2. F
  3. [2]> #'f
  4. #<FUNCTION F (X) (DECLARE (SYSTEM::IN-DEFUN F)) (BLOCK F X)>
復(fù)制代碼


在 Common Lisp 中,函數(shù)名和變量名有各自的空間,互不干涉。

(f 1) 以 1 為參數(shù)調(diào)用函數(shù) f。 f 是函數(shù)名。clisp 通過 f 找到對(duì)應(yīng)的函數(shù)對(duì)象,并執(zhí)行。

但寫成 (funcall f 1) 就會(huì)出錯(cuò),因?yàn)榇藭r(shí) f 出現(xiàn)在表的第二個(gè)位置,clisp 會(huì)在變量名空間中查找 f。


  1. [3]> (f 1)
  2. 1
  3. [4]> (funcall f 1)

  4. *** - EVAL: variable F has no value
  5. The following restarts are available:
  6. USE-VALUE      :R1      You may input a value to be used instead of F.
  7. STORE-VALUE    :R2      You may input a new value for F.
  8. ABORT          :R3      ABORT
復(fù)制代碼


出錯(cuò)信息是:variable F hsa no value.

(funcall f 1) 錯(cuò)誤,正確的寫法是 (funcall #'f 1)

如果把函數(shù)對(duì)象綁定到一個(gè)變量上而不是函數(shù)名字上,那么調(diào)用方式就要改變。


  1. [6]> (setq g #'f)
  2. #<FUNCTION F (X) (DECLARE (SYSTEM::IN-DEFUN F)) (BLOCK F X)>
復(fù)制代碼


此時(shí) (g 1) 會(huì)出錯(cuò),因?yàn)?g 處在函數(shù)名的位置上,clisp 會(huì)到函數(shù)名空間去查找它。查不到當(dāng)然出錯(cuò),
但如果函數(shù)名空間中也有一個(gè) g,那就會(huì)調(diào)用錯(cuò)誤的函數(shù)。

正確的寫法是 (funcall g 1),或等價(jià)地 (funcall #'f 1)

如果我們?cè)俣x一個(gè)值為 1 的變量 f,就可以獲的很暈的效果


  1. [1]> (setq f 1)
  2. 1
  3. [2]> (defun f (x) x)
  4. F
  5. [3]> (f f)
  6. 1
  7. [4]> (funcall #'f f)
  8. 1
  9. [5]> (apply #'f (list f))
  10. 1
復(fù)制代碼


總而言之,表的第一項(xiàng)放函數(shù)名,其它地方放函數(shù)對(duì)象。

[ 本帖最后由 retuor 于 2009-2-18 16:21 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-02-17 14:17 |只看該作者

--?---

但 lambda 表達(dá)式的行為有點(diǎn)不一樣。


  1. [1]> ((lambda (x) x) 1)
  2. 1
  3. [2]> (funcall (lambda (x) x) 1)
  4. 1
  5. [3]> (funcall #'(lambda (x) x) 1)
  6. 1
復(fù)制代碼


它出現(xiàn)在什么位置都可以。《 On lisp 》 說:“A lambda-expression can also be considered as the name of a function.”

所以 lambda 表達(dá)式能出現(xiàn)在表的第一項(xiàng),也能出現(xiàn)在后面的項(xiàng)。是這樣嗎?

[ 本帖最后由 retuor 于 2009-2-17 14:19 編輯 ]

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-02-17 17:30 |只看該作者
我覺的lambda表達(dá)式就是函數(shù)常量. 引不引用都一樣.

所以求值為函數(shù)對(duì)象的地方lambda表達(dá)式都可以出現(xiàn).

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-02-18 12:41 |只看該作者
這里頭還是有個(gè)判斷標(biāo)準(zhǔn)的,但我不清楚它在哪里。

又用 emacs lisp 試了一下。 在 elisp 中,lamba 是一個(gè)宏。代碼為:


  1. (defmacro lambda (&rest cdr)
  2.   "Return a lambda expression.
  3. A call of the form (lambda ARGS DOCSTRING INTERACTIVE BODY) is
  4. self-quoting; the result of evaluating the lambda expression is the
  5. expression itself.  The lambda expression may then be treated as a
  6. function, i.e., stored as the function value of a symbol, passed to
  7. `funcall' or `mapcar', etc.

  8. ARGS should take the same form as an argument list for a `defun'.
  9. DOCSTRING is an optional documentation string.
  10. If present, it should describe how to call the function.
  11. But documentation strings are usually not useful in nameless functions.
  12. INTERACTIVE should be a call to the function `interactive', which see.
  13. It may also be omitted.
  14. BODY should be a list of Lisp expressions.

  15. \(fn ARGS [DOCSTRING] [INTERACTIVE] BODY)"
  16.   ;; Note that this definition should not use backquotes; subr.el should not
  17.   ;; depend on backquote.el.
  18.   (list 'function (cons 'lambda cdr)))
復(fù)制代碼


注釋真多呀,去掉后為:


  1. (defmacro lambda (&rest cdr)
  2.   (list 'function (cons 'lambda cdr)))
復(fù)制代碼


lambda 宏造出 lambda 表達(dá)式:一個(gè)以符號(hào) 'lambda 起頭的表。參考注釋中的:

A call of the form (lambda ARGS DOCSTRING INTERACTIVE BODY) is
self-quoting; the result of evaluating the lambda expression is the
expression itself.  


我發(fā)現(xiàn) lambda 宏和表達(dá)式中的符號(hào) lambda 似乎是不相干的。如果把 lambda 宏定義成其它東西,然后執(zhí)行以下代碼:

(funcall (list 'lambda '(x) x) 1)

得到 1.

仿照 lambda 宏的定義,我可以寫一個(gè)自己的宏


  1. (defmacro make-lambda (&rest cdr)
  2.   (list 'function (cons 'lambda cdr)))
復(fù)制代碼


(funcall (make-lambda (x) x) 1) 得到 1。即使同時(shí)取消 lambda 宏的原有定義也不影響這個(gè) make-lambda

但我定義出來的 make-lambda 并不能復(fù)制 lambda 的全部能力。首先 “self-quoting” 就做不到,
其次,make-lambda 出來的東西不能放在表的第一項(xiàng)。

((lambda (x) x) 1) 是合法的,但 ((make-lambda (x) x) 1) 就不合法。出錯(cuò)信息為:


  1. Register 1 contains the text:
  2. Debugger entered--Lisp error: (invalid-function (make-lambda (x) x))
  3.   ((make-lambda (x) x) 1)
  4.   eval(((make-lambda (x) x) 1))
  5.   eval-last-sexp-1(nil)
  6.   eval-last-sexp(nil)
  7.   call-interactively(eval-last-sexp nil nil)
復(fù)制代碼


似乎宏沒有被展開。不明白為什么。如果 make-lambda 被展開,則結(jié)果與 lambda 宏被展開無異。

(macroexpand (lambda (x) x))  和 (macroexpand (make-lambda (x) x)) 的值都是


  1. (function (lambda (x) x))
復(fù)制代碼


另外,根據(jù)注釋,上面的 function 換成 quote 也是可以的。

[ 本帖最后由 retuor 于 2009-2-18 13:39 編輯 ]

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-02-18 14:00 |只看該作者

由函數(shù)返回一個(gè) lambda 表達(dá)式

(lambda () (lambda () 1) 是一個(gè) lambda 表達(dá)式,對(duì)其求值,得到

((lambda () (lambda () 1))  ->  (lambda () 1)

再把這個(gè)表達(dá)式求值應(yīng)該得到 1,但

(((lambda () (lambda () 1)))) 得到:

Debugger entered--Lisp error: (invalid-function ((lambda nil (lambda nil 1))))
  (((lambda nil ...)))
  eval((((lambda nil ...))))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp nil nil)

而 (funcall ((lambda () (lambda () 1)))) 就得到 1。

所以從函數(shù)返回的 lambda 表達(dá)式已經(jīng)是個(gè)函數(shù)對(duì)象,跟直接輸入

((lambda (x) 1) 1) 不一樣。

[ 本帖最后由 retuor 于 2009-2-18 14:01 編輯 ]

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-02-18 16:10 |只看該作者
(list 'function (cons  'lambda cdr))  
請(qǐng)教樓主,我想知道這里的“function”也是宏嗎?在哪里定義的?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2009-02-18 16:24 |只看該作者
function 是 elisp 的,common lisp 里不一定有。

function 是個(gè) special form,類似宏,可以不對(duì)參數(shù)求值。

[ 本帖最后由 retuor 于 2009-2-18 16:34 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP