我正在Mac上学习Common Lisp(Clozure CL),并在一位慷慨贡献者的帮助下安装了quicklisp“ltk”库在运行(ltk::ltk eyes)或(ltk:ltktest)时工作。
运行(ql:quickload“ltk”)似乎可以工作,因为它返回以下内容:
加载1 ASDF系统:
ltk公司
;加载“ltk”
运行“ltk”文档中的以下代码时出现问题剧本如下:
(ql:quickload "ltk") ;my addition to the script
(defun hello-1()
(with-ltk ()
(let ((b (make-instance 'button
:master nil
:text "Press Me"
:command (lambda ()
(format t "Hello World!~&")))))
(pack b))))
但是,当我运行(hello-1)时,我得到这个:
错误:找不到名为BUTTON的类。
执行时:FIND-CLASS,进程内侦听器(4)。
键入cmd-/继续,cmd-若要中止,请按cmd-\获取可用重新启动的列表。
如果继续:再次尝试查找类
类型:其他选择。
我猜“ltk”库在函数定义中没有被正确访问我试图通过使用ltk来解决这个问题:使用ltk,因为它似乎是一个ltk函数。
(defun hello-1()
(ltk:with-ltk ()
(let ((b (make-instance 'button
:master nil
:text "Press Me"
:command (lambda ()
(format t "Hello World!~&")))))
(pack b))))
但这产生了以下错误看起来我在修复它的时候越来越近了,因为2D画布也出现在GUI提醒我这个错误。
谢谢你的帮助。
最佳答案
Common Lisp操作属于包的符号Lisp阅读器负责将符号的非限定引用解析为实际的限定符号这取决于读取代码时绑定到*PACKAGE*
的当前包正如评论中所建议的,您应该阅读p.seibel的§21. Programming in the Large: Packages and Symbols。
您可以定义自己的包,如下所示:
(defpackage :test-ltk
(:use :cl :ltk))
:use
子句是Practical Common Lisp的声明性等价物上述操作使USE-PACKAGE
包继承来自公共Lisp和LTK包的所有外部符号通常,不能同时使用太多的包,因为很可能会发生冲突:属于不同包但具有相同名称的两个符号不能以非限定方式访问这有点像C++,不鼓励你做test-ltk
。为了有选择地导入一些符号而不是其他符号,可以使用
using namespace std
。例如,可以按如下方式定义前面的包:(defpackage :test-ltk
(:use :cl)
(:import-from :ltk #:with-ltk #:button #:pack))
在这里,您只列出您实际访问的3个符号。
:import-from
表示法表示不需要的符号,即不属于任何包的符号,只用于其名称你可以用字符串(大写)代替。然后,使用
#:symbol
更改当前包根据当前包的定义解决对符号的不合格访问:(in-package :test-ltk)
(defun hello-1 ()
(with-ltk ()
(pack
(make-instance 'button
:master nil
:text "Press Me"
:command (lambda () (format t "Hello World!~&"))))))
关于user-interface - 找不到常见的Lisp ltk“按钮”类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49178760/