Permalink
Browse files

繁體中文新增 6.2

親愛的提交審閱者  安安,

本次提交新增了繁體中文 6.2 小節,你可以親臨此處閱讀:http://goo.gl/kjUrr

你謙卑的僕人,

台北小碼農 Juanito Fatas Huang 於臺北 <katehuang0320@gmail.com>
  • Loading branch information...
1 parent 07748b2 commit be97709d2a67be1f556a6be2ffe7e278a1be5533 @JuanitoFatas committed Jun 5, 2012
Showing with 49 additions and 0 deletions.
  1. +49 −0 ch6.rst
View
49 ch6.rst
@@ -80,6 +80,55 @@ Chapter 6 函數 (Functions)
6.2 區域函數 (Local Functions)
===============================
+藉由 ``defun````symbol-function`` 搭配 ``setf`` 所定義的函數是全域函數。你可以像存取全域變數那樣,在任何地方存取它們。定義區域函數也是有可能的,區域函數和區域變數一樣,只在某些語境內可以存取。
+
+區域函數可以使用 ``labels`` 定義,是一種像是給函數使用的 ``let`` 。它的第一個參數是一個新區域函數的列表,而不是變數規格說明的列表。每一個列表中的元素都有如下形式:
+
+::
+
+ (name parameters . body)
+
+而 ``labels`` 表達式剩下的部份,呼叫 ``name`` 等同於呼叫 ``(lambda parameters . body)``
+
+::
+
+ (labels ((add 10 (x) (+ x 10))
+ (consa (x) (cons 'a x)))
+ (consa (add10 3)))
+
+這方面與 ``let`` 類似。由 ``labels`` 表達式所定義的區域函數,可以被其他任何在此定義的函數參照,包括自己。所以是可能可以這樣定義一個遞迴的區域函數:
+
+::
+
+ (labels ((len (lst)
+ (if (null lst)
+ 0
+ (+ (len (cdr lst)) 1))))
+ (len '(a b c)))
+
+5.2 小節展示了一個 ``let`` 表達式,怎麼理解為一個函數呼叫。一個 ``do`` 表達式可以同樣被解釋成一個遞迴函數的呼叫。一個這樣形式的 ``do`` :
+
+::
+
+ (do ((x a (b x))
+ (y c (d y)))
+ ((test x y) (z x y))
+ (f x y))
+
+等同於
+
+::
+
+ (labels ((rec (x y)
+ (cond ((test x y)
+ (z x y))
+ (t
+ (f x y)
+ (rec (b x) (d y))))))
+ (rec a c))
+
+這個模型可以用來解決任何你仍然對於 ``do`` 行為有疑惑的問題。
+
6.3 參數列表 (Parameter Lists)
================================

0 comments on commit be97709

Please sign in to comment.