Lisp(SBCL)用户输入程序报错求助:未定义变量NAME
问题排查与解决:Lisp中未定义变量NAME的警告
问题原因
你代码里的let表达式作用域使用错误。在Common Lisp中,let的语法是(let ((变量 初始值)) 体代码),变量的有效范围仅限于let的体代码部分。你的代码里(let ((name (read))))直接用括号闭合了,没有把后续需要使用name的代码包含在let的体里,导致后面的(princ name)引用的是未定义的全局变量,因此触发警告。
修正后的代码
调整括号结构,将需要访问name的语句放到let的体内部:
(defun say-hello () (princ "What is your name? ") (let ((name (read))) (princ "Hello: ") (princ name)))
补充说明
- Lisp社区通用命名惯例:函数名通常用连字符分隔小写字母(比如
say-hello),而非驼峰式SayHello。 - 如果需要读取带空格的名字(比如全名),可以把
read换成read-line,示例:
(defun say-hello () (princ "What is your name? ") (let ((name (read-line))) (princ "Hello: ") (princ name)))
内容的提问来源于stack exchange,提问作者Coldchain9
相关产品推荐
相关产品推荐

