Common lisp 公共Lisp let函数

Common lisp 公共Lisp let函数,common-lisp,let,Common Lisp,Let,我刚开始用CommonLisp编程,然后回顾我在上一节课中编写的程序,我很难理解代码中的问题 (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" "

我刚开始用CommonLisp编程,然后回顾我在上一节课中编写的程序,我很难理解代码中的问题

(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块内部调用函数,所以我假设我犯了一个错误。欢迎提供有关我的代码的任何其他提示。

您的代码:

(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))))
您的代码:

(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))))

defvar
不会做你认为它会做的事情。它确保变量存在,如果碰巧不存在,则将其绑定到第二个参数。因此:

(defvar *test* 5)
(defvar *test* 10) ; already exist, has no effect
*test* ; ==> 5
您可以这样在文件顶部定义它们,并在函数中使用
setf

(defvar *message*)

(defun input-1 ()
       (setf *message* (read-line))
       ...)
毕竟,设置是你正在做的事情。您将函数和变量与
字母表混用。这里可以使用
defparameter
。它类似于
defvar
,但在加载文件时总是覆盖:

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

defvar
不会做你认为它会做的事情。它确保变量存在,如果碰巧不存在,则将其绑定到第二个参数。因此:

(defvar *test* 5)
(defvar *test* 10) ; already exist, has no effect
*test* ; ==> 5
您可以这样在文件顶部定义它们,并在函数中使用
setf

(defvar *message*)

(defun input-1 ()
       (setf *message* (read-line))
       ...)
毕竟,设置是你正在做的事情。您将函数和变量与
字母表混用。这里可以使用
defparameter
。它类似于
defvar
,但在加载文件时总是覆盖:

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

可能重复的可能重复的好的,谢谢。为什么像get int和get string这样的函数没有被识别?@Mitchell:不清楚您试图编译什么以及如何编译。我只看到函数
CIPHER-CALC
的警告……是的,一旦我解决了变量问题,它就自行解决了。再次感谢。好的,谢谢。为什么像get int和get string这样的函数没有被识别?@Mitchell:不清楚您试图编译什么以及如何编译。我只看到函数
CIPHER-CALC
的警告……是的,一旦我解决了变量问题,它就自行解决了。再次感谢。谢谢,我没有意识到我正在将这些列表定义为函数。谢谢,我没有意识到我正在将这些列表定义为函数。