【发布时间】:2020-01-24 11:22:06
【问题描述】:
我用 Common Lisp 编写了一个应用程序,它生成 Java 源代码并将其写入 *.java 文件。
我想通过调用 Java 编译器来完成 Lisp 代码,最后运行编译后的 Java 代码。
全部来自 Lisp 应用程序。
建议,请。提前致谢。
【问题讨论】:
标签: java lisp common-lisp
我用 Common Lisp 编写了一个应用程序,它生成 Java 源代码并将其写入 *.java 文件。
我想通过调用 Java 编译器来完成 Lisp 代码,最后运行编译后的 Java 代码。
全部来自 Lisp 应用程序。
建议,请。提前致谢。
【问题讨论】:
标签: java lisp common-lisp
您可能希望将 Java 编译器作为外部进程运行。所有现代 Common Lisp 实现都使用 ASDF,其中包括其 IUOP 库(用于实现和操作系统可移植性的实用程序)。
所以,直接试试吧:
(uiop:run-program (list "javac" "--option" "myfile.java") :output t)
:output t 使其打印到标准输出。
在 lisp 中,一个错误会弹出交互式调试器。如果你想很好地捕捉和打印错误:
(handler-case
(uiop:run-program (list "javac" "--stuff") :output t)
(error (c) (format t "~a" c)))
要异步运行它,请使用launch-program。
阅读更多:https://lispcookbook.github.io/cl-cookbook/os.html#running-external-programs
【讨论】:
没有语言定义的方法可以从 CL 调用外部程序。然而,许多实现都提供了一种方法来执行此操作,并且有一个名为 external-program 的兼容性库,它为许多实现提供了此功能的通用包装器。
这个库本身可以通过Quicklisp获得。
【讨论】:
uiop:run-program 和uiop:launch-program,它们是ASDF 的一部分,因此已经存在几乎无处不在。