在使用REPL时,定义函数和宏是有帮助的,特别是如果你试图为某些东西制作宏,然后将其模拟为函数,并且每次调用宏.Common Lisp中有可能取消定义吗?
为什么这不起作用:
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)
如果类型重叠,我会假设稍后会检查它。
我想写一些通用的数学函数,而不假设我的类型是可复制的.这似乎是不可能的,因为数学运算符消耗了这些值,而不是借用它们.所以需要复制对象,只是为了简单的数学运算.我也可以移动它们,但是当我想改变一个结构时,这在借用的上下文中是不可能的.
这里有一些简单的例子,问题在哪里:
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)
当我只想用结构的不可复制对象(例如向量的长度)计算某些东西时,它将无法工作,因为该值将被消耗,因此结构变得无效,或借用检查器说"不能摆脱借来的背景".在改变结构时,我如何才能正确使用泛型数学?它是否只适用于可复制类型(或显式克隆)?
在(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'.
我在着色器中写了一些顶点数据给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) 我想将引用(指针)保存到我保存在另一个变量中的某些数据的一部分:
(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) 我想在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)
我怎么能做我想做的事?