【发布时间】:2017-07-27 22:53:28
【问题描述】:
出于快速原型设计的目的,我想开始构建 Common Lisp 中提供的一些基本函数的通用版本的库,而不是仅仅为手头的任务收集(或导入)特殊用途的函数。例如,map 函数适度泛化以对任何类型的序列进行操作,但不处理可调整向量。编写下面的特殊用途扩展似乎足以满足当前使用,但仍然有限:
(defun map-adjustable-vector (function adjustable-vector)
"Provides mapping across items in an adjustable vector."
(let ((new-adj-vec
(make-array (array-total-size adjustable-vector)
:element-type (array-element-type adjustable-vector)
:adjustable t
:fill-pointer (fill-pointer adjustable-vector))))
(dotimes (i (array-total-size adjustable-vector))
(setf (aref new-adj-vec i) (funcall function (aref adjustable-vector i))))
new-adj-vec))
我想看看如何编写这样的函数,该函数还需要一个输出类型规范(包括一个新的“可调整向量类型”)并允许多种列表和向量作为输入——在其他单词,仿照map。
更广泛地说,了解是否有与编写此类通用函数相关的基本原则或想法会很有用。例如,专门针对输出类型规范的通用方法是否是上述功能的可行方法?或者,也许,可以利用map 本身在泛化中的形象,如Mapping into a tree of nested sequences 上一篇文章中所述的核心转储?我不知道泛化是否有任何限制(除了一定的低效率),但我想看看它能走多远。
【问题讨论】:
-
map可以很好地处理可调向量。 -
@sds,
map的结果向量的可调整性未定义。 -
由于
adjust-array适用于不可调整的数组,我认为差异无关紧要。 -
@sds,除了如果数组是可调的,
adjust-array将返回相同的数组。 -
是的,关键是
map破坏了填充指针。但我仍然对如何泛化内置函数感兴趣。 (我一直在考虑的另一个类似示例是coerce,它似乎可以扩展到涵盖其他合理的“等效”类型化对象转换。)
标签: mapping common-lisp generalization