Pointers lisp编程中是否有指针?

Pointers lisp编程中是否有指针?,pointers,lisp,Pointers,Lisp,我没有具体的示例代码或任何东西。我只是想知道lisp中是否有指针。如果有,请分享一个简单的例子Lisp没有实际的指针。但是,根据我们的经验,我们可以通过添加一个间接级别来模拟它们。我们可以使用某种容器,例如cons单元格或defstruct (defstruct pointer array offset) (defun pointer-deref (ptr) (aref (pointer-array ptr) (pointer-offset ptr))) (defun set

我没有具体的示例代码或任何东西。我只是想知道lisp中是否有指针。如果有,请分享一个简单的例子

Lisp没有实际的指针。但是,根据我们的经验,我们可以通过添加一个间接级别来模拟它们。我们可以使用某种容器,例如cons单元格或defstruct

(defstruct pointer
    array
    offset)
(defun pointer-deref (ptr)
  (aref (pointer-array ptr) (pointer-offset ptr)))
(defun set-pointer-deref (ptr value)
  (setf (aref (pointer-array ptr) (pointer-offset ptr)) value))
(defsetf pointer-deref set-pointer-deref)

(defvar my-array (vector 1 2 3 4 5 6 7 8 9 10))
(defvar my-ptr (make-pointer :array my-array :offset 3))
(print (pointer-deref my-ptr)) ; prints 4
(setf (pointer-deref my-ptr) 20)
(print my-array) ; prints #(1 2 3 20 5 6 7 8 9 10)
(incf (pointer-offset my-ptr))
(print (pointer-defer my-ptr)) ; prints 5
(defvar my-array-2 (vector 15 30 40))
(setf (pointer-array my-ptr) my-array-2 (pointer-offset my-ptr) 0)
(print (pointer-deref my-ptr)) ; prints 15
上述代码大致类似于此C代码:

int my_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *my_ptr = &my_array[3];
printf("%d\n", *my_ptr);
*my_ptr = 20;
for (int i = 0; i < 10; i++) {
  printf("%d ", my_array[i]);
}
my_ptr++;
printf("%d\n", *my_ptr);
int my_array2[] = {15, 30, 40};
my_ptr = &my_array2[0];
printf("%d\n", *my_ptr);
intmyu数组[]={1,2,3,4,5,6,7,8,9,10};
int*my_ptr=&my_数组[3];
printf(“%d\n”,*my\u ptr);
*my_ptr=20;
对于(int i=0;i<10;i++){
printf(“%d”,my_数组[i]);
}
我的ptr++;
printf(“%d\n”,*my\u ptr);
int my_array2[]={15,30,40};
my_ptr=&my_array2[0];
printf(“%d\n”,*my\u ptr);

与Lisp的动态类型保持一致,这些指针可以指向任何类型的数据,您不必声明类型。另一方面,这个实现只支持指向数组元素的指针,而C指针也可以指向变量和结构成员。更复杂的实现可以使用CLO来定义不同的指针类,并使用通用函数来一致地使用它们。这也可以解决C语言中的一些指针安全问题;它们可以检查偏移量是否在范围内,防止增加不指向数组元素的指针等。

否,Lisp没有指针。许多Lisp实现都将其作为扩展,因此一些内置函数可以用Lisp编写,并与底层C实现接口。如果Lisp中没有指针,那么Lisp中是否有任何命令可以与指针具有相同的概念?我的意思是,就像Solidity一样。Solidity没有switch case,但可以使用if-else的形式来实现switch case。Lisp值通常作为封面下的指针来实现(fixnums等即时值除外)。但是没有什么能与C语言中的一般指针相类似。它们只是指向整个对象的指针,没有什么能像指向特定数组元素的指针。当然,您可以在更高的级别上执行
(cons array index)
。事实上,这就是Lisp机器C实现C指针的方式。但它不是泛化的——您不能使用相同的符号来获取cons中特定单元格的指针。