Common lisp 与其它语言的集成
ECL使用C/C++来编译lisp程序,可以同c/c++很好的集成在一起,互相调用。它同guile 类似,不同的是guile不支持Common lisp。
Corman是为windows量身打造的,开放源代码,其IDE不免费。可以很好的同c/c++集成,互相调用(in-process COM server),其提供的widnows api接口使用了CLOS,使用自然简洁。
(defmethod handle-message ((window) (message ) wparam lparam) (declare (ignore wparam lparam)) (begin-paint window) (let ((rect (hello-text-rect window))) (GetClientRect (window-hwnd window) rect) (DrawText (window-hdc window) (ct:create-c-string "Hello, World") -1 rect (logior DT_SINGLELINE DT_CENTER DT_VCENTER))) (end-paint window) 0)
cffi(Common Foreign Function Interface)为各种common lisp方言提供了统一的与c/c++语言通讯的接口。可以调用windows api。同时由于swig支持cffi,所以可以使用swig来自动生成lisp下的接口代码。lispbuilder提供了一个lispbuilder-windows(windows.h wrapper)模块,提供了windows.h的接口代码。并有一个演示gui的例子。
如果使用common lisp进行一些gui编程,可以考虑ltk,它使用tcl/tk做为gui前端,并将 tk的代码转换成common lisp风格。扩展起来也比较容易。
--------------------------------------------------------------------
二、从C/C++中调用Lisp
http://objectmix.com/lisp/701820-call-lisp-c-c.html
http://objectmix.com/lisp/362409-howto-use-lisp-scripting-language-within-c.html
--------------------------------------------------------------------
三、
Ecl是一个开源的Lisp语言实现,他最大的特点就是能作为嵌入式脚本语言来使用,另外还能将lisp代码编译生成原生的程序。
下面介绍如何使用Visual Studio来编译Ecl。
下载最新版本的Ecl代码,最新版本是12.2.1。点击下载 。
将代码解压到指定的目录下,然后打开visual studio的命令行提示界面,进入到ecl代码目录下的msvc目录中。
输入nmake,开始编译代码。
编译完成后,输入nmake install prefix=d:\ecl 将编译好的ecl项目拷贝到d:\ecl下。
进入d:\ecl,输入ecl,出现以下提示
ECL (Embeddable Common-Lisp) 12.2.1 (git:UNKNOWN)
Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya
Copyright (C) 1993 Giuseppe Attardi
Copyright (C) 2000 Juan J. Garcia-Ripoll
ECL is free software, and you are welcome to redistribute it
under certain conditions; see file 'Copyright' for details.
Type :h for Help.
Top level in: #
>
这样ecl就安装完成了。
接下来编辑一个hello.lisp的文件,保存到ecl目录下,测试下编译成可执行代码。
代码内容如下:
(princ "Hello world!")
(terpri)
(quit)
这就是一个lisp版本的hello world了。按照ecl官方的manual,输入
>(compile-file "hello.lisp" :system-p t)
悲剧的事情出现了,编译成c语言的步骤为nil,编译终止了。在这卡了很久,包括到处google。
最后到mail list下搜索,发现正确步骤:
> (require :cmp)
;;; Loading #P"D:/ECL/cmp.fas"
("CMP")
> (setf C::*COMPILE-IN-CONSTANTS* t)
T
再输入
> (compile-file "hello.lisp" :system-p t)
;;;
;;; Compiling hello.lisp.
;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=0
;;;
;;; End of Pass 1.hello.c
;;; Finished compiling hello.lisp.
;;;
#P"D:/ECL/hello.obj"
NIL
NIL
> (c:build-program "myecl" :lisp-files '("hello.obj"))
eB1tmp.c
正在创建库 D:/ECL/myecl.lib 和对象 D:/ECL/myecl.exp
#P"myecl.exe"
查看ecl文件夹下,多出来一个myecl.exe,看来ecl确实不错。
他的问题是开发人员似乎很少,所以项目的文档旧而且奇缺。
------------------------------------------------------------------------------
总结:lisp与c/c++可以实现互相调用;lisp可以调用其它语言;其他语言调用lisp不能;
可以将LISP做为COM,服务等方式,通过IPC方式调用