2013-05-11 48 views
0

我正在尝试实现计算平方和的Common Lisp函数。我有这样的:REPL中的错误:输入要使用的值而不是(FDEFINITION'X)

[1]> (defun sum-of-squares (x) 
      (reduce + 
        (mapcar 
         #'(lambda (x) (* x x)) 
         (x) 
      ))) 

的REPL接受它毫无怨言,但是当我尝试使用它:

[2]> (sum-of-squares '(1 2 3)) 

我得到这个:

*** - EVAL: undefined function X 
The following restarts are available: 
USE-VALUE  :R1  Input a value to be used instead of (FDEFINITION 'X). 
RETRY   :R2  Retry 
STORE-VALUE :R3  Input a new value for (FDEFINITION 'X). 
ABORT   :R4  Abort main loop 

我拿去x在mapcar被解释为一个函数。我究竟做错了什么?

+1

'(x)'表示调用函数'x'。如果你想引用'x'作为变量,就把它放在原来的位置。此外,您需要传递'#'+'而不是'+'来减少('+'是您没有的变量的名称,'#'+'是函数的名称+) – 2013-05-11 06:29:03

+1

我建议阅读一本好的介绍性书籍。免费下载:http://www.cs.cmu.edu/~dst/LispBook/ – 2013-05-11 08:19:01

回答

2
(defun sum-of-squares (x) 
    (reduce +       ; <- 2nd mistake 
      (mapcar 
      #'(lambda (x) (* x x)) 
      (x))))     ; <- 1st mistake 

第1个错误:(x)是函数调用。似乎没有功能 名为x,所以您报告的错误是生成的。改为使用x

第二个错误:+大概是没有绑定到一个函数作为一个值。您需要 通过使用function(或#',这是一个 阅读器宏,扩展为function表单)从功能空间“获取”它。

第三个错误:x对列表来说不是一个好名字,它在内部函数中使用 来表示不同的东西会令人困惑。

(defun sum-of-squares (list) 
    (reduce #'+ 
      (mapcar #'(lambda (element) 
         (* element element)) 
        list))) 
1

你命名了你的函数SUM-OF-SQUARES,但你把它叫做SS。

+0

这只是一个转录错误。我在repl中使用ss,因为我正在使用它,但是我改变了问题的名称以使其更清晰。 – munk 2013-05-11 18:56:53

相关问题