Lisp,指令不起作用

时间:2017-09-14 16:01:04

标签: syntax-error lisp common-lisp

我正在尝试创建一个将中缀输入更改为前缀的函数,例如:(x + 1)作为(+ x 1)输出的输入。

所以这是我目前的代码:

(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语句在主程序中起作用,但是当我从我的函数中运行它时却没有。

1 个答案:

答案 0 :(得分:4)

你缺少的是Lisp中的括号是有意义的

在C / Java / Python& c中,以下表达式是相同的:

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

在Lisp中,以下表达式非常不同:

  • a ---符号
  • (a) ---一个包含单个元素的列表,即符号a
  • (1 (2)) ---两个元素的列表:
    1. 号码1
    2. 长度为1的列表,包含数字2

在你的情况下,功能(注意缩进和填充位置!)

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

if附近有额外的parens(这导致整个if形式被解释为一个函数,带来灾难性的结果),应该是(注意换行符和缩进 - lispers不计算parens,他们看缩进以理解代码,请参阅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中的建议。