我有一个生成决策树,并将它们转换成嵌套Common Lisp的系统if与谓词检查,如果一个变量的值的语句>=或者<=一个给定的整数如
(LAMBDA (V1 V2)
(IF (>= V1 2)
(IF (<= V1 3)
(IF (<= V2 3)
(IF (>= V2 2) 16 (IF (>= V2 1) 6 0))
(IF (<= V2 4) 10 0))
(IF (<= V1 4)
(IF (>= V2 1) (IF (<= V2 3) 6 0) 0)
0))
(IF (>= V1 1)
(IF (>= V2 2) (IF (<= V2 4) 10 0) 0)
0)))
Run Code Online (Sandbox Code Playgroud)
然后我使用eval编译Lisp代码,生成比解释原始决策树更快的函数.尽管如此,这个编译步骤需要花费相当长的时间:具有5000个嵌套ifs的函数需要花费一分钟来编译(在powerbook上的Clozure Common Lisp中),即使生成if语句需要大约100毫秒.为什么这么简单的结构需要这么长时间?有什么我可以做的大幅加快,一些声明可能吗?我非常感谢您提供的任何指示.
performance if-statement common-lisp runtime-compilation clozure-cl
我在使用IPv6网络时尝试用Clozure CL替换SBCL,但是遇到了类似的错误:
MIGRATIONS> (ignore-errors (ccl:make-socket :remote-host "ya.ru" :remote-port 443))
NIL
#<CCL:NO-APPLICABLE-METHOD-EXISTS #x302005215E5D>
MIGRATIONS> (ignore-errors (ccl:make-socket :remote-host "ya.ru" :remote-port 443 :address-family :internet))
NIL
#<CCL:NO-APPLICABLE-METHOD-EXISTS #x3020052549AD>
MIGRATIONS> (ignore-errors (ccl:make-socket :remote-host "ya.ru" :remote-port 443 :address-family :internet6))
#<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/16) #x3020051D4A9D>
Run Code Online (Sandbox Code Playgroud)
问题是许多库在使用CCL:MAKE-TCP-SOCKET时不指定address-family或指定:internet.
是否有一种方法可以ccl:make-socket在运行时修补以覆盖此设置?
在Clozure Common Lisp中调用(file-exists -p"somepath")时,我得到一个"未定义的函数FILE-EXISTS-P with arguments ..."错误,但在任何地方我看起来这个函数都应该可用.我甚至在使用Mx apropos时都会看到它.
我正在使用LispBox for Windows.
有没有人知道可能出现什么问题,或者可能建议我可以尝试解决这个问题的过程?
我正在尝试在CCL下运行程序,这样当程序因任何原因完成运行时,它应该退回到操作系统.目前使用此命令行(在Windows上):
\ccl\wx86cl -l test.lisp -e (quit)
Run Code Online (Sandbox Code Playgroud)
当程序成功运行到正常完成时退出,但如果出现内存不足等错误,则会在调试器中结束.如果出现错误,你怎么告诉Clozure也退出?
我看到不同版本的Common Lisp之间有不同的强制行为-想知道哪个是“正确的”或在这个看似简单的问题上是标准的模棱两可:
是
(coerce '(1 2 3) 'array)
Run Code Online (Sandbox Code Playgroud)
正确的口吻?它在Clozure Common Lisp中工作正常,但在sbcl中却不能。
当不起作用时,将列表强制转换为数组的最简单方法是什么?
谢谢
在玩图表时,我得到了一个奇怪的错误,我不太明白.下面的代码重现了这个问题.
;; Define struct to store a node with links to other nodes.
(defstruct node properties links)
;; Make two nodes
(setf a (make-node :properties '(:name a))
b (make-node :properties '(:name b)))
;; Create link from b to a. This works fine...
(push b (node-links a))
;; ... but this crosslink makes lisp chase its own tail for a while and then crash with a stack overflow.
(push a (node-links b))
Run Code Online (Sandbox Code Playgroud)
我和SBCL和Clozure得到了相同的结果.设置*print-length*为可管理的值不起作用.
所以我的问题是:为什么这段代码不能创建与循环列表相同类型的无限打印循环(即没有堆栈溢出和Ctrl-C可停止).任何输入都表示赞赏.
谢谢,保罗