标签: clozure-cl

如何加快Common Lisp`IF`语句的编译速度?

我有一个生成决策树,并将它们转换成嵌套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

4
推荐指数
1
解决办法
91
查看次数

如何在仅IPv6网络上使用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在运行时修补以覆盖此设置?

common-lisp clozure-cl

3
推荐指数
1
解决办法
184
查看次数

Clozure Common Lisp - file-exists-p未定义

在Clozure Common Lisp中调用(file-exists -p"somepath")时,我得到一个"未定义的函数FILE-EXISTS-P with arguments ..."错误,但在任何地方我看起来这个函数都应该可用.我甚至在使用Mx apropos时都会看到它.

我正在使用LispBox for Windows.

有没有人知道可能出现什么问题,或者可能建议我可以尝试解决这个问题的过程?

lisp common-lisp ccl clozure-cl

2
推荐指数
1
解决办法
114
查看次数

如何在发生错误时退出Clozure

我正在尝试在CCL下运行程序,这样当程序因任何原因完成运行时,它应该退回到操作系统.目前使用此命令行(在Windows上):

\ccl\wx86cl -l test.lisp -e (quit)
Run Code Online (Sandbox Code Playgroud)

当程序成功运行到正常完成时退出,但如果出现内存不足等错误,则会在调试器中结束.如果出现错误,你怎么告诉Clozure也退出?

common-lisp clozure-cl

2
推荐指数
1
解决办法
111
查看次数

lisp中的强制功能-数组和列表

我看到不同版本的Common Lisp之间有不同的强制行为-想知道哪个是“正确的”或在这个看似简单的问题上是标准的模棱两可:

(coerce '(1 2 3) 'array) 
Run Code Online (Sandbox Code Playgroud)

正确的口吻?它在Clozure Common Lisp中工作正常,但在sbcl中却不能。

当不起作用时,将列表强制转换为数组的最简单方法是什么?

谢谢

lisp common-lisp coerce clozure-cl

1
推荐指数
1
解决办法
125
查看次数

为什么交联的defstructs导致堆栈溢出?

在玩图表时,我得到了一个奇怪的错误,我不太明白.下面的代码重现了这个问题.

;; 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可停止).任何输入都表示赞赏.

谢谢,保罗

sbcl common-lisp data-structures clozure-cl

1
推荐指数
1
解决办法
45
查看次数