Common Lisp `case` on `read` with custom package
Common Lisp `case` on `read` with custom package
Paul G 的 OnLisp 中的以下代码如果我 运行 它在没有自定义包的 REPL 中工作正常。当我定义一个包并将其与 (in-package :mypackage)
一起使用时,它不起作用——它总是采用 case
语句中的 t
情况:
(defun run-node (name)
(let ((n (gethash name *nodes*)))
(cond ((node-yes n)
(format t "~A~%>> " (node-contents n))
(case (read)
(yes (run-node (node-yes n))) ; never hits this in package
(t (run-node (node-no n)))))
(t (node-contents n)))))
首先请注意,您正在做的事情非常危险:对 read
的无约束调用可能导致程序执行 任何代码 。如果您必须为用户输入调用read
,请以安全的方式调用它:
(with-standard-io-syntax
(let ((*read-eval* nil)
(*package* ...))
(read)))
其次,缩进您的代码以便人们可以阅读它:
(defun run-node (name)
(let ((n (gethash name *nodes*)))
(cond ((node-yes n)
(format t "~A~%>> " (node-contents n))
(case (read)
(yes (run-node (node-yes n))) ;never hits this in package
(t (run-node (node-no n)))))
(t (node-contents n)))))
现在我们可以注释您的代码(添加一些最小的 read
-defanging)来告诉您错误是什么:
(defun run-node (name)
(with-standard-io-syntax
(let ((n (gethash name *nodes*))
(*read-eval* nil))
(cond ((node-yes n)
(format t "~A~%>> " (node-contents n))
(let ((got (read)))
(format *debug-io*
"~&*package* ~16T~A~%got package~16T~A~%our package~16T~A~%"
(package-name *package*)
(typecase got
(symbol (package-name (symbol-package got)))
(t "(not a symbol"))
(package-name (symbol-package 'yes)))
(case got
(yes (run-node (node-yes n))) ;never hits this in package
(t (run-node (node-no n))))))
(t (node-contents n))))))
你会发现你读到的符号包和你比较的符号包不一样,所以符号是不同的。
Paul G 的 OnLisp 中的以下代码如果我 运行 它在没有自定义包的 REPL 中工作正常。当我定义一个包并将其与 (in-package :mypackage)
一起使用时,它不起作用——它总是采用 case
语句中的 t
情况:
(defun run-node (name)
(let ((n (gethash name *nodes*)))
(cond ((node-yes n)
(format t "~A~%>> " (node-contents n))
(case (read)
(yes (run-node (node-yes n))) ; never hits this in package
(t (run-node (node-no n)))))
(t (node-contents n)))))
首先请注意,您正在做的事情非常危险:对 read
的无约束调用可能导致程序执行 任何代码 。如果您必须为用户输入调用read
,请以安全的方式调用它:
(with-standard-io-syntax
(let ((*read-eval* nil)
(*package* ...))
(read)))
其次,缩进您的代码以便人们可以阅读它:
(defun run-node (name)
(let ((n (gethash name *nodes*)))
(cond ((node-yes n)
(format t "~A~%>> " (node-contents n))
(case (read)
(yes (run-node (node-yes n))) ;never hits this in package
(t (run-node (node-no n)))))
(t (node-contents n)))))
现在我们可以注释您的代码(添加一些最小的 read
-defanging)来告诉您错误是什么:
(defun run-node (name)
(with-standard-io-syntax
(let ((n (gethash name *nodes*))
(*read-eval* nil))
(cond ((node-yes n)
(format t "~A~%>> " (node-contents n))
(let ((got (read)))
(format *debug-io*
"~&*package* ~16T~A~%got package~16T~A~%our package~16T~A~%"
(package-name *package*)
(typecase got
(symbol (package-name (symbol-package got)))
(t "(not a symbol"))
(package-name (symbol-package 'yes)))
(case got
(yes (run-node (node-yes n))) ;never hits this in package
(t (run-node (node-no n))))))
(t (node-contents n))))))
你会发现你读到的符号包和你比较的符号包不一样,所以符号是不同的。