通用Lisp图形用户界面开发

13

我以前用Matlab的GUI工具箱开发过GUI,现在我正在使用Common Lisp进行我的项目。我需要开发一个可能包含推按钮、单选按钮、图形窗口等的GUI。

我想知道在Common Lisp中是否可行,并且是否有易于使用和学习的工具箱、库。由于我没有很强的编程背景,如果可能的话,我会避免使用高级功能。
非常感谢您提前的帮助。


搜索 common lisp gui toolkit 的网络结果似乎有很多,因此我认为可行性是有保证的。 - phils
2020年更新:这里是Tk,Qt4,Gtk3,IUP和Nuklear的介绍:https://lispcookbook.github.io/cl-cookbook/gui.html - Ehvince
5个回答

10
我支持使用LTK的建议。
然而,如果您的需求超出了LTK所提供的范围(并且您可以花费一些时间学习基本的JavaScript + HTML + CSS - 这可能意味着不回避您在问题中提到的“高级内容”),那么您可能会发现为您的应用程序制作Web界面很有用。
因为我找不到一个免费的体面的替代方法来编写CL中的可移植GUI,所以我决定编写Web应用程序而不是桌面应用程序(并将它们用作桌面应用程序 - 也就是说,在我打算使用该应用程序的计算机上启动服务器,在浏览器中打开页面并将其视为桌面应用程序;如果有些事情我无法在JavaScript中做到,例如访问网络等,则在服务器上进行)。这具有极大的可移植性优势(现在这意味着我使用SBCL在Linux上开发并在Windows上使用Clozure CL部署,目前效果非常好)。

我目前对这种应用程序的进展非常满意,使用Hunchentoot(来托管内容)+ Parenscript(将JavaScript转换为Common Lisp)+ JQuery(解决浏览器兼容性问题)+ JQueryUI(在浏览器中编写用户界面)。不用担心JS性能问题,现在它相当出色(好吧,如果您可以忽略IE9之前的IE版本并使用最新的浏览器)。几周前,我使用所有这些工具(除了JQueryUI,但很容易添加)编写了一个简单的“hello world”类型的应用程序;它可能是一个最小示例,说明我的意思。


7

看看LTK,它是与Tk GUI工具包进行接口的包装器。使用起来非常简单,对于简单应用程序应该足够。


我可以将Ltk用作绘图工具吗?还是最好使用gnuplot或其他绘图工具? - jkt
我从未这样使用过它,但是cgn(http://www.cliki.net/cgn)似乎可以胜任 - 我刚刚用quicklisp安装了它并成功运行了测试代码。 - Vsevolod Dyomkin

4
如果您在Unix-ish环境中,您可能想尝试cl-gtk2commonqt甚至CLIM。此外,您选择的UI工具包取决于您使用的Common Lisp实现。Lisp WorksAllegro CL都带有自己的UI工具包,可以(或多或少)跨平台使用。

1
除了已经提到的LTK(在我看来一直工作得很好),我也喜欢Cells-Gtk,因为Tilton的Cells是我认为编写GUI代码的一个不错的方式。(不过,LTK可能更容易入手。)
例如,下面是我刚开始使用Cells-Gtk时编写的一个非常简单的华氏度/摄氏度(以及相反方向)转换器的代码:
(defun fahrenheit->celsius (fahrenheit/string)
  (princ-to-string (handler-case
                       (* (- (read-from-string fahrenheit/string nil) 32) 5/9)
                     (error () "NaN"))))

(defun celsius->fahrenheit (celsius/string)
  (princ-to-string (handler-case
                       (+ (* (read-from-string celsius/string nil) 9/5) 32)
                     (error () "NaN"))))

(defmd celsius-fahrenheit-converter (gtk-app)
  :title "°C <-> °F"
  :position :center
  :kids
  (kids-list?
   (mk-vbox
    :kids
    (kids-list?
     (mk-hbox
      :kids
      (kids-list?
       (mk-entry :md-name :celsius
                 :init "0"
                 :text (c? (fahrenheit->celsius (widget-value :fahrenheit))))
       (mk-label :text "°C")))
     (mk-hbox
      :kids
      (kids-list?
       (mk-entry :md-name :fahrenheit
                 :text (c? (celsius->fahrenheit (widget-value :celsius))))
       (mk-label :text "°F")))))))

没有“计算”按钮或类似的东西 - 只需更改一个输入字段的值,另一个字段将即时更新。正如您所看到的,Cells自动处理小部件的状态更改 - 只需要提供正确的“管道”。

(这段代码已经几年了,我没有Cells-Gtk安装来测试它,但当我编写它时它可以正常工作。)


1

我已经尝试了一些建议,就我的经验而言,Qt和Gtk绑定可以完成工作,但它们仍然感觉有点C/C++的风格,这不是我喜欢的。我确实玩过LispWorks的免费版本,并对CAPI印象深刻,但我目前没有必要(也没有能力)投资商业许可证,因此除了玩弄示例应用程序之外,我从未做过其他任何事情。

我赞成建议去研究基于Web的UI。尽管我不喜欢编写浏览器程序,但现在有很多工具可以使其变得容忍,甚至可能变得愉悦,Restas(基于Hunchentoot的框架)非常棒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接