大家都用scheme做些什么

没有重载

只有一堆 list->string string->vector list->vector vector->list … 而不是 coerce 或者自动 type promotion

想想一下,不能写 (+ 1.5 12) 而是要写

(define three (suc (suc one)))
…
(define five (suc (suc three)))
…
(define fifteen (integer-multiply three five))
(flonum-add (flonum fifiteen (negative one)) (integer->flonum twelve))

更糟的是 list, immutable list, reference list, 各自有命名不同的相似操作

vector 同理

显然意思是方便输入的纯文本的表示, scheme 没 reader macro,自带的 vector list string 是有的专门语法,SRFI 的就不见得了,只能通过 constructor 等函数构造

1 个赞

啊!

对于「重载」的那个,我的意思是 lisp 没有 C++ 式静态分派的重载 (或别的什么动态分派),或许是因为动态语言文化上倾向于使用 predicate。但另一方面,我同意使用 list-ref 和 vector-ref 很麻烦,有一个 aref 或 elt 会很舒服。所以我想说的是,即使没有那样的「重载」,我也赞同标准库应该提供一个统一(而且常见应用要精短)的方式操作这些类型。

当然,我不觉得再提供一些专门的函数如 list-ref 和 vector-ref 以供需要时使用有什么问题。

1 个赞

lua或者其他胶水语言当然也可以。我用guile纯粹是个人偏好。也许其中的函数式范式在编写生成受约束的随机测试向量的代码时会显得简洁一些吧。

我这几天写 Clojure, 我觉得 Clojure 的重载挺好的,这样比强制覆盖同名函数有好多了。 ;)

clojure 那个更像是模式匹配,也就是一个超级 case 的语法糖。这个模式 clojure 其实不是最早的,起码 erlang 比 clojure 早。haskell、ml 也有类似的,但 haskell、ml 是静态类型语言。

太惨了,要不来玩 Scala 3 吧,scala-cli 超爽的!