2017-05-19 9 views
0

私はCommon Lispでプログラミングを始め、前のクラスのいくつかで覚えていたコードを使って、コードの問題を理解するのに苦労しています。Common Lisp let関数

(defun input-1() 
     (defvar *message* (read-line)) 
     (defvar *a-value* (parse-integer(read-line))) 
     (defvar *b-value* (parse-integer(read-line)))) 

(defun alphabet (list " " "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" 
     "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z")) 

(defun alphabet-num (list 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
      20 21 22 23 24 25 26 27 28 29)) 
;(defun inverse (value) 
; (let ((x 0)) 
; (loop while (< x 29) 
; (print x)))) 

(defun inverse (value) 
     (dotimes (x 28) 
      (when (equal (mod (* x value) 29) 1) 
      (return-from inverse x)))) 

(defun get-int (string) 
    (getf (position string alphabet) alphabet-num)) 

(defun get-string (int) 
    (getf (position int alphabet) alphabet)) 

(defun cipher-calc (character) 
    (let ((c-int (get-int character)) 
    (f-char "")) 
    (setf c-int (* *a-value* (- c-int *b-value*))) 
    (setf f-char (get-string (mod (abs c-int) 29))))) 

しかし、私はそれは難しいあなたがLETブロックの内部で関数を呼び出すことができないことを信じることを見つけるこのエラー

; in: DEFUN CIPHER-CALC 
;  (* *A-VALUE* (- C-INT *B-VALUE*)) 
; 
; caught WARNING: 
; undefined variable: *A-VALUE* 

;  (- C-INT *B-VALUE*) 
; 
; caught WARNING: 
; undefined variable: *B-VALUE* 

;  (GET-INT CHARACTER) 
; 
; caught STYLE-WARNING: 
; undefined function: GET-INT 

;  (GET-STRING (MOD (ABS C-INT) 29)) 
; 
; caught STYLE-WARNING: 
; undefined function: GET-STRING 
; 
; compilation unit finished 
; Undefined functions: 
;  GET-INT GET-STRING 
; Undefined variables: 
;  *A-VALUE* *B-VALUE* 
; caught 2 WARNING conditions 
; caught 2 STYLE-WARNING conditions 

を取得していますので、私は、私はエラーを作っていますと仮定しています。私のコード上の他のヒントは歓迎されるでしょう。

+0

の可能性のある重複http://stackoverflow.com([変数を宣言するために、「う」と「VAR」を使用しての違いは何ですか?]:あなたがファイルを読み込むときにはdefvarのようですが、それは常に上書き/ questions/762011/whats-the-difference-using-let-and-var-to-declare-a-variable) – Renzo

答えて

1

あなたのコード:

(defun input-1() 
    (defvar *message* (read-line)) 
    (defvar *a-value* (parse-integer(read-line))) 
    (defvar *b-value* (parse-integer(read-line)))) 

DEFVARは、トップレベルではなく関数の内部で使用されることを想定しています。この場合、変数は関数の実行時に定義されます。しかし、そのような関数をコンパイル、評価またはロードするだけでは、変数は定義されません。したがって、コンパイラは後であなたのコードでこれらの変数が未定義であることを警告します。

DEFVARがトップレベルで使われると、Lispは変数定義があることを認識します。

(defvar *message*) 
(defvar *a-value*) 
(defvar *b-value*)) 

(defun input-1() 
    (setf *message* (read-line)) 
    (setf *a-value* (parse-integer (read-line))) 
    (setf *b-value* (parse-integer (read-line)))) 
+0

ありがとうございました。 get-intやget-stringのような関数が認識されないのはなぜですか? – Mitchell

+0

@ミッチェル:あなたがコンパイルしようとしたこととその方法は不明です。 'CIPHER-CALC'関数の警告しか表示されません... –

+0

ええ、いったん変数を使って問題を解決したら、それは解決しました。再度、感謝します。 – Mitchell

1

defvarあなたはそう思わないと思います。変数が存在することを保証し、存在しない場合は、変数を第2引数にバインドします。したがって:

(defvar *message*) 

(defun input-1() 
     (setf *message* (read-line)) 
     ...) 

すべての設定は、あなたがやっていることです後:あなたは何ができるか

(defvar *test* 5) 
(defvar *test* 10) ; already exist, has no effect 
*test* ; ==> 5 

は、あなたのファイルの先頭に次のようにそれらを定義し、あなたの関数でsetfを使用しています。関数と変数をalphabetで混合しています。ここではdefparameterを使用できます。

(defparameter *alphabet* (list " " "a" "b" ...)) 
+0

ありがとう、私はそれらのリストを関数として定義していたことを認識していませんでした。 – Mitchell

関連する問題