我正在学习Mac上的Common (Clozure ),并在这里的一个慷慨的贡献者的帮助下安装了quicklisp。“ltk”库在运行时工作(ltk::ltktest)或(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))))但是,当我跑(你好-1)时,我得到了这样的信息:
错误:未找到名为按钮的类。执行时: FIND-CLASS,in process Listener(4)。键入cmd-/继续,cmd-。若要中止,cmd-\获取可用重新启动的列表。如果继续:再次查找类类型:?其他选择。
我的猜测是,函数定义中没有正确访问'ltk‘库?我试图通过使用ltk :with来解决这个问题,因为它似乎是一个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提醒我注意错误,所以我似乎更接近于修复它。

谢谢你的帮助。
发布于 2018-03-11 10:37:32
通用Lisp处理属于包的符号。Lisp读取器负责解析对符号的不限定引用到实际的限定符号。这取决于读取代码时绑定到*PACKAGE*的当前包。正如评论中所建议的那样,您应该阅读P. Seibel's 实用通用Lisp中的实用通用Lisp。
您可以按照以下方式定义您自己的包:
(defpackage :test-ltk
(:use :cl :ltk)):use子句是与USE-PACKAGE的声明性等价的。上述特性使得test-ltk包继承了Common和LTK包中的所有外部符号。通常,您不能在一起使用太多的包,因为您更容易发生冲突:属于不同包的两个符号,但具有相同的名称,不能以不限定的方式访问。这有点像在C++中,在那里您被劝阻不去做using namespace std。
为了有选择地导入一些符号而不是其他符号,您可以使用:import-from。例如,可以将前面的包定义为:
(defpackage :test-ltk
(:use :cl)
(:import-from :ltk #:with-ltk #:button #:pack))在这里,您只列出实际访问的3个符号。#:symbol符号表示未嵌入的符号,即不属于包且仅用于其名称的符号。您可以使用字符串(大写)代替。
然后,使用IN-PACKAGE更改当前包。对符号的非限定访问根据当前包的定义进行解析:
(in-package :test-ltk)
(defun hello-1 ()
(with-ltk ()
(pack
(make-instance 'button
:master nil
:text "Press Me"
:command (lambda () (format t "Hello World!~&"))))))发布于 2018-03-08 23:34:03
解决方案(感谢@jkiiski引用:操作符):在仔细阅读控制台中的错误消息后,我能够解决问题。编译器无法访问'ltk‘函数(使用-ltk.)还有(打包.)还有纽扣课。
更正后的代码如下(使用Quicklisp使用ltk库):
(load #P"/Users/myDirectory/quicklisp/setup.lisp")
(ql:quickload "ltk")
(defun hello-1()
(ltk:with-ltk ()
(let ((b (make-instance 'ltk:button
:master nil
:text "Press Me"
:command (lambda ()
(format t "Hello World!~&")))))
(ltk:pack b))))下一步是看看能否在C++中找到与“使用命名空间”类似的方法,这样我就不需要继续使用let:,并简化代码。
https://stackoverflow.com/questions/49178760
复制相似问题