首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >普通Lisp ` `case`‘on’read‘与自定义包

普通Lisp ` `case`‘on’read‘与自定义包
EN

Stack Overflow用户
提问于 2020-06-18 14:13:50
回答 1查看 81关注 0票数 0

如果我在没有自定义包的REPL中运行它,那么按照Paul的OnLisp编写的代码工作得很好。当我定义一个包并与(in-package :mypackage)一起使用它时,它不起作用--它总是在case语句中采用t大小写:

代码语言:javascript
运行
复制
(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)))))
EN

Stack Overflow用户

回答已采纳

发布于 2020-06-18 14:57:38

首先,请注意,您正在做的事情非常危险:对read的不受约束的调用会导致程序执行任何代码。如果必须调用read进行用户输入,请以安全的方式调用它:

代码语言:javascript
运行
复制
(with-standard-io-syntax
  (let ((*read-eval* nil)
        (*package* ...))
    (read)))

其次,缩进您的代码,以便人们可以阅读它:

代码语言:javascript
运行
复制
(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 ),以向您展示bug是什么:

代码语言:javascript
运行
复制
(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))))))

你会发现,你读过的符号包和你比较的符号包不一样,所以符号是不同的。

票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62452020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档