【问题标题】:LISP "Error Illegal function object..."LISP“错误非法函数对象...”
【发布时间】:2012-11-03 21:20:31
【问题描述】:

我刚开始在课堂上学习 lisp。我正在做一个家庭作业,其中我必须使用一些原始操作(例如 car、cdr、cons、append、reverse、atom、eq、equal 和 null)编写一些非常基本的函数。

到目前为止,这是我的代码:

(defun union2 (l1 l2)
  (cond ((null l1) l2)
        ((member((car l1) l2)) (union2((cdr l1) l2)))
        (t (cons (car l1) (union2((cdr l1) l2)))))
  )

当我尝试运行测试时:

(union2 '(5 7 2 3 1) '(3 2 4 6 9))

我收到“错误:非法函数对象:(car l1)”。我的印象是我正确地编写了代码。我究竟做错了什么? 感谢您的宝贵时间。

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

    不要在参数列表周围加上额外的括号。

    • (member((car l1) l2)) 应该是 (member (car l1) l2)
    • (union2((cdr l1) l2)) 应该是 (union2 (cdr l1) l2)

    【讨论】:

      【解决方案2】:

      尝试使用编译器,例如 SBCL:

      * (defun union2 (l1 l2)
        (cond ((null l1) l2)
              ((member((car l1) l2)) (union2((cdr l1) l2)))
              (t (cons (car l1) (union2((cdr l1) l2)))))
        )
      ; in: DEFUN UNION2
      ;     ((CAR L1) L2)
      ; 
      ; caught ERROR:
      ;   illegal function call
      
      ;     (MEMBER ((CAR L1) L2))
      ; 
      ; caught WARNING:
      ;   The function was called with one argument, but wants at least two.
      
      ;     ((CDR L1) L2)
      ; 
      ; caught ERROR:
      ;   illegal function call
      
      ;     (UNION2 ((CDR L1) L2))
      ; 
      ; caught WARNING:
      ;   The function was called with one argument, but wants exactly two.
      
      ;     ((CDR L1) L2)
      ; 
      ; caught ERROR:
      ;   illegal function call
      
      ;     (UNION2 ((CDR L1) L2))
      ; 
      ; caught WARNING:
      ;   The function was called with one argument, but wants exactly two.
      ; 
      ; compilation unit finished
      ;   caught 3 ERROR conditions
      ;   caught 3 WARNING conditions
      

      【讨论】:

      • 这没什么用。如果学生被某些特定的实现卡住了怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 2023-04-09
      相关资源
      最近更新 更多