2017-09-14 43 views
0

我試圖做一個功能,將中綴輸入更改爲前綴,例如:(x + 1)作爲輸入輸出爲(+ x 1)Lisp,不在defun工作的說明

所以這是我的時刻代碼:

(setq x '(Y + 1)) 
(if (listp x) (list (second x) (first x) (first (last x))) x) 

所以返回(+ Y 1)如果我輸入一個列表,如果它不是一個列表中的用戶輸入。

然而,問題是,我不能得到這個代碼的函數工作:

(defun prefixToInfix (x)(
    (if (listp x) (list (second x) (first x) (first (last x))) x) 
    ) 
) 

功能的確是創建,但是當我把它稱爲

(prefixtoinfix '(Y + 1)) 

我得到一個錯誤

Error: Illegal function object: (IF (LISTP X) (LIST # # #) X). 
[condition type: TYPE-ERROR] 

我不知道爲什麼我的if語句在主程序中工作,但不是當我運行它從我的功能。

+2

在函數體的周圍有多餘的括號。 – jkiiski

+0

你是什麼意思?你能糾正它嗎? –

+1

從第一行'(x)(' - >'(x)''和最後一個關閉部分的末尾刪除開頭paren。 – jkiiski

回答

4

你缺少的是在Lisp圓括號中有有意義的

在C /爪哇/ Python的& C,以下表達式是相同的:

a+b 
(a+b) 
(a)+(b) 
(((a)+(b))) 
(((((a)+(b))))) 

在Lisp中,下面的表達式有很大的不同:

  • a ---一個符號
  • (a) ---帶單個元素的列表,它是符號a
  • (1 (2)) ---兩個元素的列表:
    1. 數的長度爲1 1
    2. 列表,包含數字2

在你的情況,功能(注縮進和括號位置! )

(defun prefixToInfix (x) 
    ((if (listp x) (list (second x) (first x) (first (last x))) x))) 

if附近有額外的包袱(這導致了whol Ëif形式被解釋爲一個功能,帶來災難性的後果),而應該是(注意換行和縮進 - lispers不計的括號,他們在看縮進來理解的代碼,看到http://lisp-lang.org/style-guide/

(defun prefix-to-infix (x) 
    (if (listp x) 
     (list (second x) 
      (first x) 
      (first (last x))) 
     x)) 

PS。另請參閱want to learn common lisp中的建議。