Lisp 麦克林,如何捕捉击键?

Lisp 麦克林,如何捕捉击键?,lisp,common-lisp,mcclim,Lisp,Common Lisp,Mcclim,我现在正在学习麦克林。试图找出如何定义对击键做出反应的命令。对于名为superapp的应用程序,我有一个函数 (defun show (text) (lambda (gadget) (declare (ignore gadget)) (with-slots (text-field) *application-frame* (setf (gadget-value text-field) text)))) 在它的屏幕窗格上显示一些文本。它适用于激活回调中的窗格按钮。但是, (d

我现在正在学习麦克林。试图找出如何定义对击键做出反应的命令。对于名为
superapp
的应用程序,我有一个函数

(defun show (text)
  (lambda (gadget)
    (declare (ignore gadget))
 (with-slots (text-field) *application-frame*
(setf (gadget-value text-field)
   text))))
在它的屏幕窗格上显示一些文本。它适用于
激活回调
中的窗格按钮。但是,

(define-superapp-command (com-greet :name t :keystroke (#\g :control)) ()
 (show "Hey"))
不起作用。我知道我对它的定义是正确的,因为它与
(框架退出*应用程序框架*)
配合得很好。所以我不明白其他的事情

编辑:这就是工作变量

(define-application-frame superapp ()
 ()
 (:panes
  (tf1
   :push-button
       :label "Left"
       :activate-callback (show "HI"))
  (app :application
   :display-time nil
   :height 400
   :width 600)
  (screen :text-field))
 (:layouts
  (default
   (with-slots (text-field) *application-frame*
               (vertically ()
                screen
                (tabling (:grid t)
                 (list tf1 app)))))))

(defun show (text)
 (lambda (gadget)
   (declare (ignore gadget))
  (setf (gadget-value (find-pane-named *application-frame* 'screen)) 
    text)))

(define-superapp-command (com-greet :name t :keystroke (#\g)) ()
 (setf (gadget-value (find-pane-named *application-frame* 'screen)) 
 "text"))
在上面的函数中,您尝试从插槽中获取小工具。这不是解决问题的办法。改用FIND-PANE-NAMED。给它一个框架和窗格的名称。它将返回该窗格

(define-application-frame superapp ()
 ((text-field :initform nil))
 (:panes
  (tf1
   :push-button
       :label "Left"
       :activate-callback (show "HI"))
同样,您现在在完全不同的上下文中使用SHOW。现在,它应该返回一个LAMBDA,它将小工具作为参数获取

  (app :application
   :display-time nil
   :height 400
   :width 600)
  (screen :text-field))
 (:layouts
  (default
   (with-slots (text-field) *application-frame*
               (vertically ()
                (setf text-field screen)
                (tabling (:grid t)
                 (list tf1 app)))))))

现在
:layouts
中的代码看起来是错误的。不应在其中设置插槽文本字段。实际上,您根本不应该有槽文本字段。只需在回调中使用函数FIND-PANE-NAMED。在这里,您只需定义一个布局。

如何格式化可读的代码?这可能会有帮助。这个
lambda
的用途是什么?这里看起来不是这样的,我想我在复制时损坏了代码。Lambda,嗯,真的不确定,因为我只是从演示中复制代码块,试图找出问题所在。这是演示中的一件事。但是兰姆达应该做什么?我不知道。我怀疑这可能是连接到这个小玩意的某种方式?声明此函数不是通用函数。我看不出有什么奇怪的地方,因为在源代码中你可以找到一些功能,它们只是称自己为,没有别的,或者其他奇怪的东西。我知道它看起来好像什么都没做。如果你现在不知道LAMBDA的功能,那么把它去掉怎么样。它返回一个函数。如果该函数从未被调用,将不会发生任何事情。
(setf(名为*application frame*'screen的查找窗格)text
setf说他无法设置该函数。@AndrewS:为什么要设置窗格?我以为你想设置窗格的小工具值?我的错。编辑了它。
  (app :application
   :display-time nil
   :height 400
   :width 600)
  (screen :text-field))
 (:layouts
  (default
   (with-slots (text-field) *application-frame*
               (vertically ()
                (setf text-field screen)
                (tabling (:grid t)
                 (list tf1 app)))))))