gpt4 book ai didi

clojure 的 `into` 在普通 lisp 中

转载 作者:行者123 更新时间:2023-12-01 13:12:03 24 4
gpt4 key购买 nike

clojure 有一个方便的 (into to-coll from-coll)函数,添加来自 from-coll 的元素至 to-coll ,保留to-coll的类型。

如何在普通的 lisp 中实现这一点?
第一次尝试是

(defun into (seq1 seq2)
(concatenate (type-of seq1) seq1 seq2))

但是这个显然失败了,因为 type-of在它的结果中包含向量的长度,不允许添加更多元素(从 sbcl 开始),尽管它仍然适用于列表作为第一个参数
(虽然仍然无法获得空列表)。

问题是:是否可以在不使用泛型方法和/或复杂的 type-of 的情况下组成这种函数?结果处理(例如,去除向量/数组的长度等)?

我没问题 into充当 append (与 clojure 相反,其中 into 结果取决于目标集合类型)让我们称之为 concat-into

最佳答案

在 Clojure 中,当您使用 into 时,您对第一个集合是什么类型有一个具体的想法(大部分时间)。 ,因为它改变了语义:如果它是一个列表,额外的元素将是 conj放在前面,如果是向量,它们将是 conj回到后面,如果是 map ,则需要提供 map 条目指示符(即实际 map 条目或二元向量),集合更灵活,但也带有自己的语义。这就是为什么我猜想使用 concatenate直接、明确地提供类型,对于许多用例来说可能已经足够好了。

除此之外,我认为扩展此功能可能很有用(Common Lisp 只有一组封闭的序列类型),但为此,使用泛型函数忽略似乎太方便了。提供可扩展、通用和高性能的解决方案并非易事。

编辑:总而言之:不,您无法通过巧妙地应用一两个“内置函数”来获得这种行为,但是您当然可以使用通用函数编写可扩展的通用解决方案。

关于clojure 的 `into` 在普通 lisp 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59294775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com