在Common Lisp中,如何覆盖CLOS类的默认字符串表示形式,以便调用format或princ打印可理解的内容,即使该类的对象嵌入其他类型(如列表或数组)中也是如此?
例如,如果我(format t "~a~%" x)在x持有我的解决方案类的实例时调用,我希望它打印出类似的东西#<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>而不是#<SOLUTION {BB7CD31}>.
到目前为止,我已经设法弄清楚是编写自定义函数来处理我知道将包含此类实例的打印结构,但这很乏味.当然Lisp提供了一些免费获得此功能的方法吗?
如何配置SBCL,以便在我使用Emacs中的"Mx slime"启动时使用比默认值更多的内存?
从我在网上看到的,答案似乎是调用SBCL,传递参数"--dynamic-space-size <size in MB>".由于我不直接调用SBCL,我不知道如何传递它的参数.
我在Windows 7上使用GNU Emacs 22.3.1和SBCL 1.0.48.我也没有经验配置,所以新手的介绍将不胜感激.
我在使用Lisp的反引用读取宏时遇到问题.每当我尝试编写一个似乎需要使用嵌入式反引号的宏时(例如,``(w ,x ,,y)来自Paul Graham的ANSI Common Lisp,第399页),我无法弄清楚如何以编译的方式编写代码.通常情况下,我的代码会收到一系列错误,前面是"逗号不在反引号内".有人可以为我如何编写能够正确评估的代码提供一些指导吗?
作为一个例子,我目前需要一个宏,它采用一种描述形式的规则的形式,'(function-name column-index value)并生成一个谓词lambda体,以确定由column-index特定行索引的元素是否满足规则.如果我用规则调用这个宏'(< 1 2),我希望生成一个看起来如下的lambda体:
(lambda (row)
(< (svref row 1) 2))
Run Code Online (Sandbox Code Playgroud)
我能做的最好的努力如下:
(defmacro row-satisfies-rule (rule)
(let ((x (gensym)))
`(let ((,x ,rule))
(lambda (row)
(`,(car ,x) (svref row `,(cadr ,x)) `,(caddr ,x))))))
Run Code Online (Sandbox Code Playgroud)
经过评估,SBCL会发出以下错误报告:
; in: ROW-SATISFIES-RULE '(< 1 2)
; ((CAR #:G1121) (SVREF ROW (CADR #:G1121)) (CADDR #:G1121))
;
; caught ERROR:
; illegal function call
; (LAMBDA (ROW) ((CAR #:G1121) (SVREF ROW (CADR …Run Code Online (Sandbox Code Playgroud) 我正在实现维基百科上提供的Bowyer-Watson算法.在我的实现中,一切正常,直到伪代码的最后一部分:
for each triangle in triangulation // done inserting points, now clean up
if triangle contains a vertex from original super-triangle
remove triangle from triangulation
Run Code Online (Sandbox Code Playgroud)
如果我在字面上遵循伪代码,我最终会在Delaunay三角剖分中丢失三角形.
例如,请考虑下面的图片.我正在进行三角测量的网站呈现为蓝色圆圈.三角形用黑线(不包括图像边框)渲染,并连接网站或边界/超三角形顶点.外接圆是用灰色渲染的,它们的中心用红色圆圈渲染.Voronoi细胞每个都涂有不同的颜色(希望)使问题更加明显.
此图像显示了在执行上述伪代码中列出的步骤之前的三角测量的状态.请注意,超级三角形的两个顶点超出了图像的右侧和底部.

此图像显示删除任何包含超级三角形顶点的三角形后的步骤,无需进一步考虑:

前三个顶点应该有一个新的三角形,在绿色/褐色细胞相遇的点处有一个外心.问题是"之前"图像中显示的角顶点位于此外接圆内,因此算法的常规处理从未生成此三角形.
如何在伪代码中表达这个边缘情况,以便检查并解决它?我想避免一些可怕的"尝试与超级三角形顶点共享一个三角形的网站的每个组合以获得有效的外接圆"循环.
几年前我读了Bowyer和Watson的论文,如有必要,我会再次阅读它们.我希望(1)其他人可能有答案可用,(2)如果我再遇到这个问题,我可以使用Stack Overflow查找答案.
编辑
所以我找到了一个相对便宜但不完美的解决方案.我的超级三角形以编程方式确定为围绕网站的边界框而不与其两侧相交.这个想法是由Java的各种令人沮丧的问题引起的,考虑到我计算的一些外心坐标或坐标之间的距离是无限的.这种谨慎使我的超级三角形变得如此之小,以至于它的顶点有时落在有效三角形的外心中.增加超三角形的大小使问题似乎消失了.然而,凸包上的三角形可能是如此钝,以至于其中一个顶点仍然落入有效的外接圆内.
我认为这意味着我的初始问题在浮点数限制面前仍然有效.有没有一种廉价的方法来保证Bowyer-Watson算法产生有效的三角测量?
我正在开发一个项目,我需要以绝对精度和尽可能快的速度处理大整数(如3 ^ 361).C是我熟悉的最快的语言,所以我试图用这种语言编写我的解决方案.
问题是我无法找到任何数据类型的良好实现来表示C语言中除Python源代码之外的无限整数.我花了一些时间来完成代码并确定我需要什么.
我宁愿使用其他人的测试代码,其中包含一整套功能(加法,减法,乘法,除法,调制,求幂,等式检查......甚至按位运算都会很好),而不是花费几周的时间才能让我连开始让我自己的版本达到标准杆.虽然这将是一个很好的学习经历,但它不是我的问题的焦点,我宁愿到达我感兴趣的部分:)
我正在尝试创建一个可以在 SBCL 的插槽中存储符号向量的类。我不知道如何设置它。
到目前为止,我最好的猜测是
(defclass Individual ()
((discrete-decisions :type (vector symbol))))
Run Code Online (Sandbox Code Playgroud)
这将返回以下错误:
keyword argument not a symbol:
(DISCRETE-DECISIONS :TYPE (VECTOR SYMBOL)).
[Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]
Run Code Online (Sandbox Code Playgroud)
一些实验表明,将类型更改为只会symbol返回相同的错误。我认为这symbol是 Common Lisp 中的有效类型……我错了吗?
我怎样才能让它发挥作用?
[编辑]
我遇到的上述问题是在 Emacs 24.2 下的 09-22-2012 Slime 版本中运行 SBCL 1.0.58。当我从命令行运行 SBCL 1.0.58 时,没有问题。这似乎不是 SBCL 问题...
问题
我该如何获得一种锁定机制,提供最小且稳定的延迟,同时保证一个线程在另一个线程获取并释放资源之前无法重新获取该资源?
该问题的答案的可取性排名如下:
在 Windows 7 上的 MinGW 中工作的内置 C++11 功能的一些组合(请注意,<thread>和<mutex>库不能在 Windows 平台上工作)
Windows API 功能的一些组合
下面列出了对 FairLock 的修改,我自己尝试实现这种机制
一些功能由免费的开源库提供,不需要 .configure/make/make 安装过程(让其在 MSYS 中工作比我关心的更像是一次冒险)
背景
我正在编写一个应用程序,它实际上是一个多阶段生产者/消费者。一个线程生成由另一个线程消耗的输入,该线程产生由另一个线程消耗的输出。该应用程序使用成对的缓冲区,以便在初始延迟后,所有线程几乎可以同时工作。
由于我正在编写 Windows 7 应用程序,因此我一直使用 CriticalSections 来保护缓冲区。使用 CriticalSections(或者据我所知,任何其他 Windows 或 C++11 内置同步对象)的问题是,它不允许任何规定,即刚刚释放锁的线程无法重新获取锁直到另一个线程先这样做为止。因此,我的许多中间线程(编码器)测试驱动程序从未给编码器提供获取测试输入缓冲区的机会,并且在没有测试它们的情况下完成了它们。最终结果是一个荒谬的过程,试图确定随机适用于我的机器的人为等待时间。
由于我的应用程序的结构要求每个阶段等待其他阶段获取、完成使用并释放必要的缓冲区以再次使用缓冲区,因此由于缺乏更好的术语,我需要一个公平的锁定机制。我尝试写了一个(下面提供了源代码)。在测试中,这个 FairLock 允许我的测试驱动程序以与我使用 CriticalSection 可能达到的 60% 的运行速度相同的速度运行我的编码器。其他 40% 的运行时间要长 10 到 100 毫秒,这对于我的应用程序来说是不可接受的。
费尔洛克
// FairLock.hpp
#ifndef FAIRLOCK_HPP
#define FAIRLOCK_HPP
#include <atomic>
using namespace std;
class FairLock {
private:
atomic_bool owned {false};
atomic<DWORD> lastOwner {0};
public:
FairLock(bool owned);
bool …Run Code Online (Sandbox Code Playgroud) 我有页面需要根据XML文件中的数据描述动态加载内容.可动态加载的项目包括SWF.我有代码通过http和文件协议正确加载和启动Firefox中的电影,Chrome通过http协议启动.我需要它在http和文件协议中成功加载Internet Explorer,但所有Flash Video Player报告都是"Movie not loaded ...".有人可以查看以下信息并给我一个解决方法吗?
XML中Flash对象的描述如下所示:
<multimedia
type='flash'
swf='swf/filename_here.swf'
width='600'
height='400'
version='7.0.19.0'
/>
Run Code Online (Sandbox Code Playgroud)
我有JavaScript解析它并创建一个类似于以下JSON的对象:
{
'tag': 'multimedia',
'attributes': [
'type': 'flash',
'swf': 'swf/filename_here.swf',
'width': '600',
'height': '400',
'version': '7.0.19.0'
]
}
Run Code Online (Sandbox Code Playgroud)
最终,这个对象被传递给一个创建DOM元素的函数(是的,我知道函数的排序很奇怪;我正在尝试不同的东西来使它工作):
var path = var path = document.location.href;
path = path.substr(0, path.lastIndexOf('/') + 1);
var version = null;
function isIE() {
return navigator.userAgent.lastIndexOf('Trident') > 0;
}
function buildFlash(element) {
version = element.attributes.version;
var name = document.createElement('param');
name.setAttribute('name', 'movie');
name.setAttribute('value', path + element.attributes.swf);
(if (!isIE()) {
var inner …Run Code Online (Sandbox Code Playgroud) 我正在使用C++ 11,MinGW和Windows API进行屏幕捕获程序.我正在尝试使用SDL2来观看我的屏幕捕获程序如何实时工作.
窗口打开很好,程序似乎运行良好,只要我只做移动鼠标光标.但是如果我单击窗口,窗口外的菜单栏或按任意键,SDL窗口会冻结.
我已经为事件设置了一些日志记录来弄清楚发生了什么.我从来没有收到比其他任何事件SDL_WINDOW_FOCUS_GAINED,SDL_TEXTEDITING以及SDL_WINDOWEVENT_SHOWN按照这个顺序.所有这些都是在一开始就收到的.
我试图找到有关SDL事件处理的教程,因为这是我对问题根源的最佳猜测.我发现只需要基本的事件处理SDL_QUIT,基本的鼠标和键盘事件,以及一个SDL_WINDOWEVENT似乎没有帮助的事件.我没有深入了解事件的意义和处理它们的最佳实践.这可能无关紧要,因为这可能不是问题的根源.据我所知,SDL正在投入适合,因为还有其他线程正在运行.
任何人都可以看到我的代码挂起的任何原因,并提供如何解决它的解释?
我的程序结构的快速解释是为了涵盖我省略的代码.在Captor课程开始并运行一个线程来抓取截图传递给Encoder.的Encoder开始从接收的屏幕截图线程的数目可变Captor,编码截图,随后将编码的Screen.传递机制是SynchronousQueue<T>提供配对方法put(const T&)并T get()允许生产者和消费者使用资源进行同步的类; 这些方法超时以允许系统响应杀死消息.
现在为源文件(希望没有太多的膨胀). 虽然我很感激有关如何提高应用程序性能的任何意见,但我的重点是使程序具有响应性.
main.cpp中
#include "RTSC.hpp"
int main(int argc, char** argv) {
RTSC rtsc {
(uint32_t) stoi(argv[1]),
(uint32_t) stoi(argv[2]),
(uint32_t) stoi(argv[3]),
(uint32_t) stoi(argv[4]),
(uint32_t) stoi(argv[5]),
(uint32_t) stoi(argv[6])
};
while (rtsc.isRunning()) {
SwitchToThread();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
RTSC.hpp
#ifndef RTSC_HPP
#define RTSC_HPP
#include "Captor.hpp"
#include …Run Code Online (Sandbox Code Playgroud) 我正在编写一个方法,其中所有参数都是doubles或ints.由于两个重载的内部代码都相同,我认为编写接口接受Numbers 会更容易.
我需要在此方法中做的一件事是验证其中一个参数大于零.为了实现这一点,我可以compare()将传递的值反对为零,我有以下静态字段:
private static final Double ZERO_D = Double.valueOf(0);
private static final Integer ZERO_I = Integer.valueOf(0);
Run Code Online (Sandbox Code Playgroud)
在相关方法中,我然后尝试执行此测试:
Number zero = ((stepSize instanceof Double) ? ZERO_D : ZERO_I);
Run Code Online (Sandbox Code Playgroud)
奇怪的是这个代码总是设置zero为ZERO_D.
我目前正在使用以下代码成功解决此问题:
Number zero;
if (stepSize instanceof Double) {
zero = ZERO_D;
} else {
zero = ZERO_I;
}
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么我得到这个奇怪的结果?如果可以的话,我更愿意在这里使用三元运算符.