小编por*_*y11的帖子

是否有可能在Lisp中取消定义宏和函数?

在使用REPL时,定义函数和宏是有帮助的,特别是如果你试图为某些东西制作宏,然后将其模拟为函数,并且每次调用宏.Common Lisp中有可能取消定义吗?

lisp macros common-lisp

14
推荐指数
2
解决办法
1487
查看次数

有没有办法在多个特征上实现一个特征?

为什么这不起作用:

trait Update {
    fn update(&mut self);
}

trait A {}
trait B {}

impl<T: A> Update for T {
    fn update(&mut self) {
        println!("A")
    }
}

impl<U: B> Update for U {
    fn update(&mut self) {
        println!("B")
    }
}
Run Code Online (Sandbox Code Playgroud)
trait Update {
    fn update(&mut self);
}

trait A {}
trait B {}

impl<T: A> Update for T {
    fn update(&mut self) {
        println!("A")
    }
}

impl<U: B> Update for U {
    fn update(&mut self) {
        println!("B")
    }
}
Run Code Online (Sandbox Code Playgroud)

如果类型重叠,我会假设稍后会检查它。

generics traits rust

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

没有复制生锈的通用数学

我想写一些通用的数学函数,而不假设我的类型是可复制的.这似乎是不可能的,因为数学运算符消耗了这些值,而不是借用它们.所以需要复制对象,只是为了简单的数学运算.我也可以移动它们,但是当我想改变一个结构时,这在借用的上下文中是不可能的.

这里有一些简单的例子,问题在哪里:

use std::ops::Add;

struct NoCopy<T>(T); //some non-copyable struct, (maybe a vector)
struct Cont<T>(NoCopy<T>); //some struct contaioning a noncopyable struct

impl<T: Add<Output=T>> Add for NoCopy<T> {
    type Output = NoCopy<T>;
    fn add(self, x: NoCopy<T>) -> NoCopy<T> {
        NoCopy(self.0+x.0)
    }
}

fn main() {
    let x = NoCopy(1);
    let cont = Cont(x);
    let rel = NoCopy(2);
    cont.0=cont.0+rel; //addition makes struct cont invalid, so i have to copy
}
Run Code Online (Sandbox Code Playgroud)

当我只想用结构的不可复制对象(例如向量的长度)计算某些东西时,它将无法工作,因为该值将被消耗,因此结构变得无效,或借用检查器说"不能摆脱借来的背景".在改变结构时,我如何才能正确使用泛型数学?它是否只适用于可复制类型(或显式克隆)?

generics math rust

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

如何跳出Lisp中的函数?

在(Common)Lisp中是否可以跳转到另一个函数而不是调用另一个函数?我的意思是,当前函数被打破而另一个被调用,没有跳过数千个函数,就好像我决定自己是否完成尾调用优化,即使它不是尾部.我不确定"(从fn x返回)"是否,我想要什么.

例:

(defun fn (x)
  (when x
    (princ x)
    (jump 'fn (cdr x)))
  (rest))
Run Code Online (Sandbox Code Playgroud)

'jump'应该像调用下面的函数而不保存这个函数的位置,而是返回原来的funcall所在的位置,这样就不会有堆栈溢出.只有x为零才能执行'rest'.

lisp return common-lisp trampolines tail-call-optimization

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

使用SSBO作为下一次绘制调用的VBO输入

我在着色器中写了一些顶点数据给SSBO.然后我想将写入SSBO的数据用作VBO.这些将用于下一次绘制调用.如何才能做到这一点?

这是我现在如何做,但它仍然是段错误:

int new_vertex_count = …;
int new_index_count = …;
int* new_indices = …;

GLuint ssbo[3];
glGenBuffers(3, ssbo);


glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo[1]);
glBufferData(GL_SHADER_STORAGE_BUFFER, new_vertex_count * 3 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo[1]);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo[2]);
glBufferData(GL_SHADER_STORAGE_BUFFER, new_vertex_count * 2 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, ssbo[2]);

glBindVertexArray(vao); //bind the original VAO
glPatchParameteri(GL_PATCH_VERTICES, 16);
glEnable(GL_RASTERIZER_DISCARD); //disable displaying
glDrawElements(GL_PATCHES, index_count, GL_UNSIGNED_INT, 0); //don't draw, just 
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); //sync writing
glFinish();
glDisable(GL_RASTERIZER_DISCARD); //reanable displaying for next draw call
glBindVertexArray(0); //unbind original VAO in order to use …
Run Code Online (Sandbox Code Playgroud)

opengl shader synchronization vbo

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

Common Lisp中的指针

我想将引用(指针)保存到我保存在另一个变量中的某些数据的一部分:

(let ((a (list 1 2 3)))
  (let ((b (car (cdr a)))) ;here I want to set b to 2, but it is set to a copy of 2
    (setf b 4))
  a) ;evaluates to (1 2 3) instead of (1 4 2)
Run Code Online (Sandbox Code Playgroud)

我可以使用宏,但如果我想在列表中间更改一些数据并且我不是很灵活,那么将会有很多代码要执行:

(defparameter *list* (create-some-list-of-arrays))
(macrolet ((a () '(nth 1000 *list*)))
  (macrolet ((b () `(aref 100 ,(a))))
    ;; I would like to change the macro a here if it were possible
    ;; but then b would mean something …
Run Code Online (Sandbox Code Playgroud)

lisp pointers common-lisp

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

Common Lisp:在函数中使用未定义的变量

我想在Common Lisp中做类似的事情:

(defparameter *fun* 
  (lambda () x))

(let ((x 0))
  (funcall *fun*)) ;should return 0
Run Code Online (Sandbox Code Playgroud)

我想在定义函数时访问未定义的函数中的本地绑定.

如果我使用x作为参数,它会工作,但我无法更改变量的值:

(defparameter *fun* 
  (lambda (x) (setf x (+ x 1))))

(let ((x 0))
  (funcall *fun* x)) ;should return 1, would return 0
Run Code Online (Sandbox Code Playgroud)

我怎么能做我想做的事?

lisp common-lisp

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