2011-02-07 22 views
1

我意識到可以使用#'PRINT引用PRINT函數來引用函數。如果我們有一個列表S,其中第一個元素是'打印',我們可以使用#(車S)來引用它嗎?在運行時按名稱調用函數

假設我正在查看一個列表,其中列表中的元素是原子,這些原子是某些函數的名稱。目前,我可以這樣做:

(defun aritheval (S) 
    (funcall 
     (cond 
      ((eq '+ (car S)) #'+) 
      ((eq '- (car S)) #'-) 
      ((eq '* (car S)) #'*) 
      ((eq '/ (car S)) #'/) 
     ) 
     '2 
     '3 
    ) 
) 

此功能將計算2 + 3,2-3,2 * 3或2/3取決於列表S. S中的第一個元素包含了這些函數的名稱。

回答

6

#(汽車S)沒有任何意義。語法存在,但是指具有符號CAR載體和S.

使用

(funcall (first somelist) someargument) 

(apply (first somelist) a-list-of-arguments) 

你的函數是非Lispy格式化。

正確的Lisp代碼中不使用尾括號。你也不需要引用數字。數字是自我評估,他們評估自己。此外,我們現在可能更傾向於CAR和REST over CDR。功能相同,但名稱更好。每當我們處理簡單的列表時,都會使用FIRST,SECOND,THIRD,...和REST。

(defun aritheval (S) 
    (funcall (cond ((eq '+ (car S)) #'+) 
       ((eq '- (car S)) #'-) 
       ((eq '* (car S)) #'*) 
       ((eq '/ (car S)) #'/)) 
      2 3))) 

因爲符號可以用作全局函數的名稱,所以不需要以上。

下面的這個函數是相同的,因爲從符號到函數的映射是相同的。

(defun aritheval (s) 
    (funcall (first s) 2 3))) 
+0

如何引用函數名稱存儲在列表中的函數?假設列表S已由(setq S'(PRINT RESTORE))定義 – 2011-02-08 06:18:00

相關問題