首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未找到常见的Lisp ltk‘按钮’类

未找到常见的Lisp ltk‘按钮’类
EN

Stack Overflow用户
提问于 2018-03-08 17:11:01
回答 2查看 255关注 0票数 1

我正在学习Mac上的Common (Clozure ),并在这里的一个慷慨的贡献者的帮助下安装了quicklisp。“ltk”库在运行时工作(ltk::ltktest)或(ltk:ltktest)。

运行(ql:quickload "ltk")似乎可以工作,因为它返回以下内容:

负载1 ASDF系统: ltk 装货"ltk“

我在运行“ltk”文档中的以下代码时遇到了问题。下面是剧本:

代码语言:javascript
复制
(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函数。

代码语言:javascript
复制
(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提醒我注意错误,所以我似乎更接近于修复它。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-11 10:37:32

通用Lisp处理属于包的符号。Lisp读取器负责解析对符号的不限定引用到实际的限定符号。这取决于读取代码时绑定到*PACKAGE*的当前包。正如评论中所建议的那样,您应该阅读P. Seibel's 实用通用Lisp中的实用通用Lisp

您可以按照以下方式定义您自己的包:

代码语言:javascript
复制
(defpackage :test-ltk
  (:use :cl :ltk))

:use子句是与USE-PACKAGE的声明性等价的。上述特性使得test-ltk包继承了Common和LTK包中的所有外部符号。通常,您不能在一起使用太多的包,因为您更容易发生冲突:属于不同包的两个符号,但具有相同的名称,不能以不限定的方式访问。这有点像在C++中,在那里您被劝阻不去做using namespace std

为了有选择地导入一些符号而不是其他符号,您可以使用:import-from。例如,可以将前面的包定义为:

代码语言:javascript
复制
(defpackage :test-ltk
  (:use :cl)
  (:import-from :ltk #:with-ltk #:button #:pack))

在这里,您只列出实际访问的3个符号。#:symbol符号表示未嵌入的符号,即不属于包且仅用于其名称的符号。您可以使用字符串(大写)代替。

然后,使用IN-PACKAGE更改当前包。对符号的非限定访问根据当前包的定义进行解析:

代码语言:javascript
复制
(in-package :test-ltk)

(defun hello-1 ()
  (with-ltk ()
    (pack
     (make-instance 'button 
                    :master nil
                    :text "Press Me"
                    :command (lambda () (format t "Hello World!~&"))))))
票数 2
EN

Stack Overflow用户

发布于 2018-03-08 23:34:03

解决方案(感谢@jkiiski引用:操作符):在仔细阅读控制台中的错误消息后,我能够解决问题。编译器无法访问'ltk‘函数(使用-ltk.)还有(打包.)还有纽扣课。

更正后的代码如下(使用Quicklisp使用ltk库):

代码语言:javascript
复制
(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:,并简化代码。

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

https://stackoverflow.com/questions/49178760

复制
相关文章

相似问题

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