我是Common Lisp的新手,我正在尝试学习如何使用网络套接字进行编程.在常见的lisp usocket api中,它指定了函数socket-send
并socket-receive
采用simple-array (unsigned-byte 8)
缓冲区.
我对lisp太新了解如何在sbcl common lisp中实现这一点.看来我可以使用这些功能vector
,make-array
但不能使用simple-array
,也不能指定类型unsigned-byte 8
.
有类似以下的合理和类型安全吗?:
(let ((buffer (make-array (list-length input))) (input-length (list-length input)) )
(loop
for i upto input-length collect i do
(setf (nth i buffer) (parse-integer (nth i input))))
(usocket::socket-send socket buffer input-length)))
Run Code Online (Sandbox Code Playgroud)
如果没有,我如何完成制作我需要的那种缓冲区?
我正在努力真正理解LISP,以便有一个良好的基础向前发展,但它一直很慢,因为LISP(在我的情况下特别是Common Lisp)不遵循任何C族命名约定.
这是我对LISP列表的个人定义,它基本上是正确的吗?:LISP中的所有列表都是使用void指针构建为单链表,用于节点和下一个指针.
编辑:为了澄清,我使用"无效指针"这个词来表示关于cons-cell的CAR和CDR的本质的想法.我理解LISP中不存在'void指针',我试图在这里将概念从C应用到LISP
我想从函数返回一个布尔值或成功/失败枚举,并通过引用修改参数。但是,我想在调用函数中构造一个引用,而不是复制该值。
我有一些容器(例如std :: queue类型的“ example_q”)。queue.front()将返回对存储在队列中的值的引用。我可以复制该引用(示例A),也可以复制该引用(示例B),从而允许该值保留在队列中,但可以在队列外使用。
一种)
int a = example_q.front();
Run Code Online (Sandbox Code Playgroud)
B)
int& b = example_q.front();
Run Code Online (Sandbox Code Playgroud)
使用此差异,我还可以返回排队的值:
一种)
int get_front()
{
int a = example_q.front();
return a;
}
Run Code Online (Sandbox Code Playgroud)
B)
int& get_front()
{
return example_q.front();
}
Run Code Online (Sandbox Code Playgroud)
使用选项“ B”,我可以避免不必要的复制,而无需通过std :: move()语义将数据移出队列。
我的问题是,我可以通过引用传递的参数来执行“ B”吗?我是否需要以某种方式使用std :: move()/ rvalues / &&&?
void get_front(int& int_ref)
{
// somehow don't copy the value into referenced int_ref, but construct
// a reference in the caller based on an input argument?
int_ref = example_q.front();
}
Run Code Online (Sandbox Code Playgroud)
这将解决的问题是使API与其他修改引用参数但返回成功/失败值的函数匹配,即:
if(q.get_front(referrence_magic_here))
{
...
} …
Run Code Online (Sandbox Code Playgroud)