我正在尝试创建一个将中缀输入更改为前缀的函数,例如:(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语句在主程序中起作用,但是当我从我的函数中运行它时却没有。
答案 0 :(得分:4)
你缺少的是Lisp中的括号是有意义的。
在C / Java / Python& c中,以下表达式是相同的:
a+b
(a+b)
(a)+(b)
(((a)+(b)))
(((((a)+(b)))))
在Lisp中,以下表达式非常不同:
a
---符号(a)
---一个包含单个元素的列表,即符号a
(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中的建议。