Tat*_*ota 2 lisp clisp heap-memory common-lisp stack-memory
我在这里读到“允许实现忽略”Common Lisp 中的动态范围声明,我想知道它是否实际上在 CLISP 实现中被忽略了。
我尝试使用以下代码进行测试:
(let ((b (cons 1 2)))
(declare (dynamic-extent b))
(list b))
Run Code Online (Sandbox Code Playgroud)
返回:
((1 . 2))
Run Code Online (Sandbox Code Playgroud)
我的猜测是它被忽略了,但我想确定一下。
另外,如果它被忽略,我有没有办法将内存显式分配给堆栈而不是堆?
> 有没有办法让我显式地将内存分配给堆栈而不是堆?
不,您可以感谢它,因为它消除了程序中的一整类错误:不会有指向已经死的对象的“悬空指针”,从而使您的程序崩溃。
此外,使用 CLISP 或类似的实现,您不需要堆栈分配的内存,因为:
最后,坚持对象的堆栈分配会阻止您自由选择适合您问题的编程风格。Lisp 支持多种编程风格:函数式、过程式、面向对象、基于模式、逻辑、关系、规则、面向目标等等。通过请求堆栈分配,您可以限制自己使用函数式和过程式编程风格;这真的不会让你前进。