2011-04-12 98 views
0

我把編譯此功能時得到的隨機錯誤:「未定義功能的」編寫遞歸GCD用Lisp

(defun gcd (a b) 
    (if (= b 0) 
     a 
     (gcd b mod (a b)))) 

最常見的是,它說,所以我想我需要在那個地方回來。這沒有奏效。我得到了許多if語句錯誤的參數。任何想法我在這裏做錯了嗎? Lisp新手,迄今爲止我們沒有看到對方。

在Windows 7上運行CLISP

回答

6

在Lisp的函數調用始終*以 '(',太行

(gcd b mod(a b)) 

意味着「調用函數gcd與參數b,mod和調用函數a的結果與參數b「。

我懷疑你真的類似:

(gcd b (mod a b)) 

*我沒有用Lisp的一小會兒,所以我可能不能上「總是」 100%正確。

+0

這將是它。我絕對沒有使用正確的語法來調用mod方法。 – yaegerbomb 2011-04-12 05:56:52

2

(gcd b mod(a b))應該(gcd b (mod a b))

1

mod函數調用是錯誤的。這是我的工作代碼:

(defun gcd2(a b) 
    (if (= b 0) a (gcd2 b (mod a b)))) 
0

通常一個編譯器可以給你更多的信息:

使用LispWorks:

(defun gcd1 (a b) 
    (if (= b 0) 
     a 
     (gcd1 b mod (a b)))) 


CL-USER 31 > (compile 'gcd1) 
;;;*** Warning in GCD1: GCD1 is called with the wrong number of arguments: Got 3 wanted 2 
;;;*** Warning in GCD1: MOD assumed special 

The following function is undefined: 
A which is referenced by GCD1 
GCD1 

所以你看,你叫GCD1數錯誤的論點,即假設MOD是一個變量,A被假定爲一個函數。

SBCL:

; in: DEFUN GCD1 
;  (GCD1 B MOD (A B)) 
; 
; caught WARNING: 
; The function was called with three arguments, but wants exactly two. 

; in: DEFUN GCD1 
;  (A B) 
; 
; caught STYLE-WARNING: 
; undefined function: A 

;  (GCD1 B MOD (A B)) 
; 
; caught WARNING: 
; undefined variable: MOD