2017-09-14 49 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中的建议。