主要问题:我将尾部调用优化(TCO)的最重要应用视为递归调用到循环的转换(在递归调用具有某种形式的情况下).更准确地说,当翻译成机器语言时,这通常会转换成某种跳跃系列.编译为本机代码(例如SBCL)的一些Common Lisp和Scheme编译器可以识别尾递归代码并执行此转换.基于JVM的Lisp(例如Clojure和ABCL)在执行此操作时遇到了麻烦.JVM作为一台可以防止或使其变得困难的机器是什么?我不明白.JVM显然没有循环问题.编译器必须弄清楚如何进行TCO,而不是编译它的机器.
相关问题:Clojure 可以将看似递归的代码转换成循环:如果程序员用关键字替换对函数的尾调用,它就好像它正在执行TCO一样recur
.但是,如果有可能让编译器识别尾调用 - 例如SBCL和CCL那样做 - 那么为什么Clojure编译器不能确定它应该按照它处理的方式处理尾调用recur
呢?
(对不起 - 这无疑是一个常见问题解答,我确信上面的评论显示了我的无知,但我找不到早期的问题是不成功的.)
如何产卵关闭后台(命名)子进程/线程中ABCL?也就是说,我想生成子进程(或线程)以在后台运行并让顶级评估免费用于其他处理.
使用(apropos'进程/线程)我发现了下面列出的未记录的函数,但我无法弄清楚语法.我正在寻找运行示例代码来遵循/修改.我似乎已经创建了一个具有以下make-process函数的进程,但是当我尝试杀死它时出现错误,并且它在前台运行.ABCL手册中没有关于make-process的条目.列出了MAKE-THREAD,但没有记录.
ABCL手册中列出的所有功能的文档/示例在哪里有" 未记录 "的名称?(也是那些与apropos一起发现的?)
作为一个单独但相关的问题,是否有一个在线ABCL特定运行代码示例的存储库,涵盖了像这样的边缘案例问题?
在其他常见的lisps我会使用如下函数:
(activate-process *initial-process*)
Run Code Online (Sandbox Code Playgroud)
要么
#+(:and MULTITASKING :lucid)
(defun mpd (&optional (reinit nil))
(user::make-process :name "Pdraw-proc" :function #'pd::pdraw :args (list reinit)))
Run Code Online (Sandbox Code Playgroud)
在ABCL,我已经糊里糊涂了不远处:
CL-USER> (setf uu (make-thread (my-reader))) <-- runs at the top level / hogs read loop
CL-USER> (setf jj (system::%make-process (foo)))
#S(SYSTEM:PROCESS :JPROCESS 3 :INPUT NIL :OUTPUT NIL :ERROR NIL)
CL-USER> jj
#S(SYSTEM:PROCESS :JPROCESS 3 :INPUT NIL :OUTPUT NIL :ERROR NIL)
SYSTEM::MAKE-PROCESS (fbound)
SYSTEM::%PROCESS-KILL (fbound)
SYSTEM::%MAKE-PROCESS (fbound)
Run Code Online (Sandbox Code Playgroud)
和 …
有谁知道如何(或者如果)你可以使用ABCL将Lisp代码编译为.class文件并创建一个main方法,以便整个事件可以打包成.jar文件并运行?
另外,有没有人知道如何从ABCL代码访问原语Java类型?