小编And*_*rei的帖子

如何 (zerop #*000) 在普通 lisp 中?

有没有一种有效的方法来检查位向量是否全为零?(我在 Linux 上使用 SBCL。)我浏览了文档,但找不到合适的函数。到目前为止我想出的最好的是:

(defun bit-zerop (array)
  (equal array (make-array (length array) :element-type 'bit)))

(bit-zerop #*000)
Run Code Online (Sandbox Code Playgroud)

我也试过

(defun bit-zerop (array)
  (dotimes (i (length array))
    (if (eql (sbit array i) 1)
        (return-from bit-zerop nil)))
  t)
Run Code Online (Sandbox Code Playgroud)

但它在较大的位向量上比第一个版本慢大约 100 倍。(这是预期的,因为每个 64 位字被读取 64 次,我猜,而不是一次)。当然,第一个版本是次优的,它必须分配一个新数组。

编辑:上述解决方案的时间安排。

编辑 2:带有类型声明的时间。

(defun bit-zerop-1 (array)
  ;; (declare (simple-bit-vector array))
  (equal array (make-array (length array) :element-type 'bit)))

(defun bit-zerop-2 (array)
  ;; (declare (simple-bit-vector array))
  (every #'zerop array))

(defun bit-zerop-3 (array)
  ;; (declare (simple-bit-vector array))
  (loop
     for bit …
Run Code Online (Sandbox Code Playgroud)

common-lisp

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

ECL是否支持回调?

问题听起来微不足道,但经过一段时间查看ECL文档,CFFI文档并诉诸谷歌,我仍然无法得出明确的答案.ECL文档没有提到回调语法,CFFI文档没有提到关于ECL中回调的任何实现限制,并且我无法将google提示的页面转换为逻辑.

common-lisp ecl

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

限制调试输出中的字符串长度

我使用 emacs、slime 和 sbcl。当条件发生时我被扔进调试器时,如何限制输出的大小?我已经弄清楚了*print-length**print-level*,但是对于长字符串或多行字符串该怎么办?说,

(defun monkeys (length)
  "Generate a random string"
  (with-output-to-string (out)
    (dotimes (i length)
      (write-char
       (code-char
        (let ((c (random 27)))
          (if (zerop c)
              (if (zerop (random 5)) 10 32)
              (+ 95 c)))) out))))

(1+ (monkeys 10000)) ; drop into debugger
Run Code Online (Sandbox Code Playgroud)

sbcl common-lisp slime

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

SBCL 的 REPL 中的内存泄漏

我对 REPL 中 SBCL 垃圾收集器的以下行为感到有些困惑。定义两个函数:

(defun test-gc ()
  (let ((x (make-array 50000000)))
    (elt x 0)))

(defun add-one (x) (+ 1 x))
Run Code Online (Sandbox Code Playgroud)

然后运行

(add-one (test-gc))
Run Code Online (Sandbox Code Playgroud)

我希望不再有任何东西引用原始数组。然而,正如(房间)报告的那样,内存并未被释放。我会理解,如果我直接运行 (test-gc),那么某些引用可能会卡在 SLIME 或中的某处

(list * ** ***)
Run Code Online (Sandbox Code Playgroud)

但这里的情况是这样吗?谢谢,安德烈。

更新前段时间我提交了一个错误。最近这一消息得到了证实。请参阅: https: //bugs.launchpad.net/sbcl/+bug/936304

memory-leaks sbcl common-lisp

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

使用SBCL FFI传递和接收字符串

我有一个用优化的c(library.c)编写的复杂库:

#include <stdio.h>
#include "library.h"

void make_fullname(char* fullname, char* name, int version) {
  sprintf(fullname, "%s-%d", name, version);
  printf("lib-name: %s\n", name);
  printf("lib-fullname: %s\n", fullname);
}
Run Code Online (Sandbox Code Playgroud)

其中library.h包含

void make_fullname(char* fullname, char* name, int version);
Run Code Online (Sandbox Code Playgroud)

该库编译如下:

gcc library.c -o library.so -shared
Run Code Online (Sandbox Code Playgroud)

我试图从SBCL中使用它,这是我的最后一个(我放弃并转向stackoverflow):

(load-shared-object "library.so")

(define-alien-routine make_fullname void
  (fullname (c-string :external-format :ascii))
  (name (c-string :external-format :ascii))
  (x int))


(defun print-name-version (name version)
  (with-alien ((fullname (c-string :external-format :ascii)))
    (setf fullname (make-alien char 100))
    (setf fullname "dummy-string")
    (make_fullname fullname name version)
    (format t "~a~%" fullname)))
Run Code Online (Sandbox Code Playgroud)

在运行时,例如,(print-name-version"Program"1)我得到了这个 …

lisp common-lisp

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

使用点表示法访问CLOS插槽

访问类槽时,而不是写

(defmethod get-name ((somebody person) (slot-value somebody 'name))
Run Code Online (Sandbox Code Playgroud)

是否可以使用点符号aka C++,即

(defmethod get-name ((somebody person) somebody.name) ?
Run Code Online (Sandbox Code Playgroud)

否则,当方法中有许多槽操作时,(slot-value...会创建大量的样板代码.

我今天已经找到了答案,我只是将其作为问答发布,但如果有更好的解决方案或者我的解决方案存在问题,请随时添加新的答案或评论.

common-lisp clos

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

是否可以在 R 中进行动态绑定?

是否可以在 R 中使用动态绑定的变量?说,有这样的工作:

f1a <- function() {
  x <- 1
  f2()
}

f1b <- function() {
  x <- 2
  f2()
}

f2 <- function() {
  f3()
}

f3 <- function() {
  # print x
}

f1a() # prints 1
f1b() # prints 2
Run Code Online (Sandbox Code Playgroud)

我可以x明确地传递堆栈,但这不是我想要的。我在询问动态绑定的可能性。我知道很多人会说x明确传递总是可取的,但假设我不能改变f2(I can change f1a, f1band f3)的定义。当然,我可以有一个全局变量,但如果可能的话,我宁愿使用动态绑定。

r

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

标签 统计

common-lisp ×6

sbcl ×2

clos ×1

ecl ×1

lisp ×1

memory-leaks ×1

r ×1

slime ×1