1

クラスで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)」が表示されます。コードを正しく書いているという印象を受けました。私は何を間違っていますか?お時間をいただきありがとうございます。

4

2 に答える 2

3

引数リストの周りに余分な括弧を入れないでください。

  • (member((car l1) l2))する必要があります(member (car l1) l2)
  • (union2((cdr l1) l2))する必要があります(union2 (cdr l1) l2)
于 2012-11-03T22:50:44.377 に答える
1

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
于 2012-11-03T21:41:36.060 に答える