如何解决Common Lisp中分配内存的操作是什么? 在语言实现的最低版本中
我认为唯一的操作是 cons ,但似乎还有其他操作。
解决方法
Lisp系统必须以某种方式为其提供的所有对象类型提供内存分配和管理。 cons
函数是仅用于con单元格和由一个或多个cons单元组成的对象的专用分配器/构造函数。普通Lisps还具有通常不是由cons细胞组成的各种对象。
Common Lisp标准语言不公开任何低级内存分配。各种对象以三种方式形成:通过专用功能(如make-symbol
进行构造);读者从语法上进行构造,然后将现有值转换为新值。例如, (subseq "abcd" 1 3)
产生"bc"
,这是一个新分配的字符串对象,其bc
数据也可能是新分配的内存。
Common Lisp实现者必须评估将要提供的所有各种对象,为它们选择表示形式,并以某种底层的内存管理策略以某种方式实现所有这些功能。可以有多个内存管理系统。某些对象可以由来自不同分配器的块组成。例如。简而言之,一个字符串对象可能来自与分配器类似的分配器,这要利用所有此类对象的大小相等,但是字符串的原始字符数据(由字符串对象引用)可能来自面向字符串的不同分配器。
,任何创建新对象的操作都必须为其分配某种资源。枚举这些东西几乎是不可能的,并且其中一些确实没有名称。例如
(defun c (a)
(lambda (b)
(+ b a)))
可以在每次调用时分配内存,当然有时也必须这样做,但是也可能没有阻止(eq (c 1) (c 1))
为真的情况。
(defun d ()
(lambda (b)
b))
不需要分配内存,但是可以分配内存(在我尝试过的实现中,它在解释代码中分配,但是在编译代码中不需要)。
(defun e (a)
(lambda (b)
(incf a b))
必须始终进行分配(因此(eq (e 1) (e 1))
不能为真)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。