这种情况一次又一次地发生在我身上:我定义了这个类并忘记了我想要它的功能,或者它是,例如,Gtk小部件类,因此它的元类需要说明.一旦它被定义,但是,SBCL不会让我改变了我的元类(即使没有这个类的实例).例如,评估
(defclass foo ()
((slot-a)))
Run Code Online (Sandbox Code Playgroud)
然后添加元类并重新评估:
(defclass foo ()
((slot-a))
(:metaclass gobject:gobject-class))
Run Code Online (Sandbox Code Playgroud)
导致错误:
Cannot CHANGE-CLASS objects into CLASS metaobjects.
[Condition of type SB-PCL::METAOBJECT-INITIALIZATION-VIOLATION]
See also:
The Art of the Metaobject Protocol, CLASS [:initialization]
Run Code Online (Sandbox Code Playgroud)
不幸的是,我没有"元对象协议的艺术"的副本来检查它的内容.现在我唯一可以解决的方法是重启lisp,这可能会造成很大的破坏性.
由于我很快意识到错误,我不介意通过删除它完全避开已定义的类.问题:
fmakunbound功能一样的东西.如果我想创建一个程序的Lisp图像,我该如何正确地完成它?有先决条件吗?它不和QUICKLISP很好地搭配吗?
现在,如果我启动SBCL(只预装了QUICKLISP)并保存图像:
(save-lisp-and-die "core")
Run Code Online (Sandbox Code Playgroud)
然后尝试使用此图像再次启动SBCL
sbcl --core core
Run Code Online (Sandbox Code Playgroud)
然后尝试做:
(ql:quickload :cl-yaclyaml)
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
To load "cl-yaclyaml":
Load 1 ASDF system:
cl-yaclyaml
; Loading "cl-yaclyaml"
.......
debugger invoked on a SB-INT:EXTENSION-FAILURE in thread
#<THREAD "main thread" RUNNING {100322C613}>:
Don't know how to REQUIRE sb-sprof.
See also:
The SBCL Manual, Variable *MODULE-PROVIDER-FUNCTIONS*
The SBCL Manual, Function REQUIRE
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [RETRY ] Retry completing load for …Run Code Online (Sandbox Code Playgroud) 我正在使用线性代数的CL(使用SBCL 1.2.15)编写程序.在执行过程中,它通常将矩阵乘以向量.
Profiler显示,程序花费的大部分时间(80%)正是这样做的,将矩阵乘以向量.它还表明该函数可以进行大量的处理(对于100x100矩阵,可以进行大约100次调用),这也会触发GC.在F#中做了类似的事情(它具有静态类型检查的好处,但通常不会超过SBCL),F#程序的运行速度提高了10倍.
我做错了吗?
(defun matrix-mul (matrix vector dest)
"Multiply MATRIX by VECTOR putting the result into DEST.
Optimized for DOUBLE-FLOAT vectors and matrices"
(declare (type (array double-float (* *)) matrix)
(type (vector double-float *) vector dest)
(optimize (speed 3) (debug 0) (safety 0)))
(destructuring-bind (rows cols) (array-dimensions matrix)
(dotimes (i rows)
(setf (aref dest i)
(loop for j below cols sum (the double-float
(* (aref matrix i j) (aref vector j))))))))
Run Code Online (Sandbox Code Playgroud)
PS.我也尝试过使用DOTIMES而不是内部循环 - 没有区别
PPS.下一个选项可以使用CL中的BLAS,但是(i)我不期待它在Windows上运行,(ii)需要来回编组矩阵/向量.
我正在从Common Lisp程序(gnuplot)中产生一个进程.我能够为流程建立输入和输出流.但是,我从输出中读取时出现问题.问题是我想尝试从输出中读取,如果没有任何内容,那么......不要做任何事情.
(基本问题:我想读取命令的结果,show term但我想跳过gnuplot在发送此命令之前可能产生的任何其他输出)
如果我只是使用(read-line gnuplot-output nil :eof)并且输出流中没有任何内容,它将不会指示:eof(因为流仍处于活动状态并且可能会出现某些内容)并且将阻塞直到它有东西要读(即永远).
有没有办法检测到没有东西可读?至少,以某种方式安全地超时读取的尝试(即一旦超时,它不应该从流中弹出一个新行)?
PS.我正在使用SBCL
如果我有一个类,例如包含几个将填充向量的插槽,则通常会出现此问题.如果我想让这个类的对象或多或少透明,我实现print-object它.在这里我遇到了问题:
这是代码.考虑两个类:
(defclass foo ()
((slot1 :initarg :slot1)
(slot2 :initarg :slot2)))
(defclass bar ()
((foo-slot :initarg :foo)))
Run Code Online (Sandbox Code Playgroud)
我有以下几个例子:
(defparameter *foo*
(make-instance 'foo
:slot1 '(a b c d e f g h i j k l m n o p q r s t u v)
:slot2 #(1 2 3 4 5 6 7 8)))
(defparameter *bar*
(make-instance 'bar
:foo *foo*))
Run Code Online (Sandbox Code Playgroud)
我想看到的是这样的:
> *bar*
#<BAR
foo-slot = #<FOO
slot1 = (A B C D E F G …Run Code Online (Sandbox Code Playgroud) 我有一个表格,用于使用#+PLOT:指令绘制图形,并将图形发送到文件中。在我的导出中,我想排除表格,但只包含绘图。后者很简单:[[file:./plot.png]]就可以了。前者似乎更难一些。在另一个示例中,我使用表来存储绘图的参数:绘图本身是使用直接 gnuplot 脚本和:var data=param-table :exports result. 再说一遍,我不想要这张桌子。
我有两个部分解决方案:
:exports none脚本即可。效果很好。但是如果该表不是由脚本生成的怎么办?:noexport:,但是将其靠近完成绘图的位置很好(并且更符合逻辑),否则我将不得不引入不必要的低级标题。在组织模式中是否有类似#+NOEXPORT的标记,我可以将其放置在表格之前以防止其导出?
我正在尝试为Sundials CVODE库编写CFFI包装器.SWIG对Sundials标题感到窒息,因为它们相互关联,SWIG找不到正确的标题,所以我手工完成:有点费力,但我已经管理好了.
现在我正在尝试测试它是否正常工作.现在,只需创建"问题对象"并删除它.这就是问题开始的地方.因此,"问题对象"是通过函数分配的
SUNDIALS_EXPORT void *CVodeCreate(int lmm, int iter);
Run Code Online (Sandbox Code Playgroud)
为此我创建了包装器:
(cffi:defcfun "CVodeCreate" :pointer
(lmm :int)
(iter :int))
Run Code Online (Sandbox Code Playgroud)
PS.SUNDIALS_EXPORT(至少在Unix上)基本上没什么.
现在,为了销毁对象,Sundials使用它自己的功能:
SUNDIALS_EXPORT void CVodeFree(void **cvode_mem);
Run Code Online (Sandbox Code Playgroud)
所以,我需要将它的引用传递给它CVodeCreate.在C中,如果我的记忆没有错,我会做类似的事情CVodeFree(&problem_object).在CL我写了这个函数的包装器:
(cffi:defcfun "CVodeFree" :void
(cvode-mem :pointer))
Run Code Online (Sandbox Code Playgroud)
所以,这COVDE-MEM是一个指向指针的指针.问题是如何在CL/CFFI中获取指针的指针?这是代码的开头:
(defvar *p* (cvodecreate 1 2))
Run Code Online (Sandbox Code Playgroud)
(PS.不要担心传递的数字CVODECREATE,他们只是告诉使用哪些方法,仍然需要定义常量以使其更具可读性)
所以*P*是一样的东西
#.(SB-SYS:INT-SAP #X7FFFE0007060)
Run Code Online (Sandbox Code Playgroud)
如果我直接传递给它CVODEFREE,它最终会出错:
CL-USER> (cvodefree *p*)
; Evaluation aborted on #<SIMPLE-ERROR "bus error at #X~X" {1005EC9BD3}>.
Run Code Online (Sandbox Code Playgroud)
我试过传递,(CFFI:POINTER-ADDRESS *P*)但它导致类似的"总线错误......"(甚至不确定此函数是否返回我需要的).我也尝试过(CFFI:MAKE-POINTER (CFFI:POINTER-ADDRESS *P*)),再一次没有任何成功.
这个问题暗示了这种方法:
(cffi:with-foreign-object …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 twpbvpc(带有重新网格化的 ODE BVP)Fortran-77 求解器编写一个包装器。求解器需要带签名的输入函数
subroutine fsub(ncomp, x, u, f, rpar, ipar)
Run Code Online (Sandbox Code Playgroud)
在哪里
ncomp 是一个整数(向量的长度),x (in) 是一个浮点数,u(in) 是一个长度为 的向量ncomp,f (out) 是结果的位置,长度向量 ncomprpar和ipar是浮点数和整数外部参数的数组;Julia 的关闭将是更受欢迎的方式,但显然它存在困难(请参阅此处的博客文章)。但暂时可以忽略它们。在 Julia 中,写fsub我通常会使用签名
function fsub_julia(x :: Float64, y :: Vector{Float64}, dy :: Vector{Float64})
dy[1] = ...
dy[2] = ...
...
end
Run Code Online (Sandbox Code Playgroud)
ncomp似乎没有必要,因为可以通过lengthor获取长度size(但是,Julia 可以检测从 Fortran 传递的数组的大小吗?对于测试代码,我ncomp明确知道,所以现在这不是问题)。
所以,为了符合 twpbvpc 格式,我写了一个包装器:
function fsub_par(n :: Int64, x :: Float64, y …Run Code Online (Sandbox Code Playgroud) 也许我会问一些非常微不足道的事情,但是我在Pharo(Pharo 4)做多种选择之间感到有些困惑.
我开始为Pharo/Smalltalk开发一个名为PolyMath的库.我正和这个项目的其他人合作.他们在smalltalkhub上设置了主存储库和收件箱存储库,包括Jankins CI.因此,从我的角度来看,事情非常简单:进行更改,创建切片并将其保存到收件箱存储库中.
当我正在处理这段代码时,我想保存更改(我认为Pharo会在常规基础上为我做这件事)以防我的计算机崩溃,或者我需要重新启动它来安装更新.或者更有野心:在另一台笔记本电脑上工作(也许,通过将更改保存到Dropbox).同时,由于更改不完整,我不希望将更改推送到收件箱存储库.
如果我将更改保存到本地包缓存中,则包不再"脏"; 并且我不知道切片是否会产生正确的更改以将它们推送到收件箱存储库.
我应该在我正在处理的软件包上做文件吗?(但是当我稍后提交它们时,这个动作会让其他一些软件包变脏,也许它们已经连接了?)我也可以保存图像,但我想不时地重新加载图像来获取其他更新的图像.人.
只是回顾一下我想要实现的目标:
我遇到了相当奇怪的问题:QLineEdit通过鼠标点击它们无法访问界面中的对象,但使用Tab它们会收到焦点并响应键盘输入.但即使他们有焦点,他们也不会回应点击.令人讨厌的是,最后添加的内容QLineEdit确实会对点击做出响应.
额外的问题:鼠标不可访问的行编辑不显示工具提示.
我使用Common Lisp的qtools来构建接口,所以我将不得不解释它是如何工作的.简而言之,我在循环中逐个添加行编辑,所有这些都以相同的方式创建并添加到QGridLayout.
更新:请参阅下文,了解问题的可能来源
参数小部件用于表示一个参数输入.每个参数都有一个名称,值和单位(度量).名称和单位显示为标签,值可编辑,并由表示QLineEdit
(define-widget parameter-widget (QWidget)
((parameter :initarg :parameter)))
(define-subwidget (parameter-widget label) (q+:make-qlabel parameter-widget)
(setf (q+:text label) (parameter-base-name parameter)))
(define-subwidget (parameter-widget entry) (q+:make-qlineedit parameter-widget)
(setf (q+:alignment entry) +align-right+)
(setf (q+:text entry) (format nil "~A" (parameter-value parameter)))
(setf (q+:tool-tip entry) (parameter-base-description parameter)))
(define-subwidget (parameter-widget units) (q+:make-qlabel parameter-widget)
(setf (q+:text units) (parameter-units parameter)))
Run Code Online (Sandbox Code Playgroud)
要指示参数值已更改,parameter-widget将发出新信号parameter-changed(它转换为Qt的信号"parameterChanged"):
(define-signal (parameter-widget parameter-changed) ())
Run Code Online (Sandbox Code Playgroud)
行编辑的插槽尝试将文本转换为数字,如果成功,则更新基础参数并发出parameter-changed: …