13

在编写 Common Lisp 代码时,我真正怀念的一件事是访问 Python 库,包括标准库和第三方模块。CLPython 提供了一个有限的 Python 功能子集,它排除了大多数库的使用,所以这对我来说并不是很有用。我希望能够从 Common Lisp 调用 Python 代码,这样它就可以在 CPython 或 PyPy 等 Python VM 中运行。

4

5 回答 5

4

(编辑)我们现在有 py4cl:https ://github.com/bendudson/py4cl

Py4CL 是 Common Lisp 和 Python 之间的桥梁,它使 Common Lisp 能够与 Python 代码进行交互。它使用流与单独的 python 进程进行通信,cl4py 采用的方法。这与被盗电池使用的 CFFI 方法不同,但目标相同。

这是使用 Lisp 程序中的 Numpy 和 Scipy 的示例:

(ql:quickload :py4cl)

(py4cl:import-module "numpy" :as "np")
(py4cl:import-module "scipy.integrate" :as "integrate")

;; Integrate some ODEs
(defparameter *data*
  (integrate:odeint 
   (lambda (y time) 
     (vector (aref y 1)       ; dy[0]/dt = y[1]
             (- (aref y 0)))) ; dy[1]/dt = -y[0]
   #(1.0 0.0)   ; Initial state
   (np:linspace 0.0 (* 2 pi) 20)))  ; Vector of times

您可能还喜欢async-process,它允许将代码发送到正在运行的 Python 进程。它用于Lem 编辑器

示例使用:

CL-USER> (ql:quickload :async-process)
To load "async-process":
  Load 1 ASDF system:
    async-process
; Loading "async-process"
..................................................
[package async-process].
(:ASYNC-PROCESS)
CL-USER> (in-package async-process)
#<PACKAGE "ASYNC-PROCESS">
ASYNC-PROCESS> (create-process "python")
#.(SB-SYS:INT-SAP #X7FFFEC002830)
ASYNC-PROCESS> (defparameter p *)
#.(SB-SYS:INT-SAP #X7FFFEC002830)
ASYNC-PROCESS> (process-receive-output p)
"Python 2.7.13 (default, Nov 24 2017, 17:33:09) 
[GCC 6.3.0 20170516] on linux2
Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.
>>> "
ASYNC-PROCESS> (process-send-input p "1+1
")
; No value
ASYNC-PROCESS> (process-receive-output p)
"1+1
2
>>> "
于 2019-02-20T23:26:13.007 回答
3

一种解决方案是python-on-lisp。它应该是 ASDF 可安装的。它已经有几年没有维护或更新了,所以可能会有更好的东西可用。

于 2011-04-06T09:39:24.107 回答
3

您可能想尝试burgled-batteries,这是 Python 和 Lisp 之间的桥梁(FFI 绑定等)。

根据描述,“burgled-batteries在 Python(特别是 Python 的 CPython 实现)和 Common Lisp 之间提供了一个 shim。”

于 2015-07-13T07:26:18.773 回答
2

我建议为您的代码编写一个“暴露器”接口,该接口接受文本并写入文本,以便您可以在命令行上调用它。理想情况下,使用典型的 STDIN | 标准输出方法。

我相信这通常是非性能应用程序的最佳方法。

于 2011-03-02T22:27:46.533 回答
1

我知道这是不同的语言,但你为什么不试试Clojure 和 Jython :) :)

也许你会在你想要的地方找到你自己。

于 2011-03-04T00:12:10.917 回答