有没有一种有效的方法来检查位向量是否全为零?(我在 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) 问题听起来微不足道,但经过一段时间查看ECL文档,CFFI文档并诉诸谷歌,我仍然无法得出明确的答案.ECL文档没有提到回调语法,CFFI文档没有提到关于ECL中回调的任何实现限制,并且我无法将google提示的页面转换为逻辑.
我使用 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) 我对 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
我有一个用优化的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)我得到了这个 …
访问类槽时,而不是写
(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...会创建大量的样板代码.
我今天已经找到了答案,我只是将其作为问答发布,但如果有更好的解决方案或者我的解决方案存在问题,请随时添加新的答案或评论.
是否可以在 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)的定义。当然,我可以有一个全局变量,但如果可能的话,我宁愿使用动态绑定。