hashtable-merge!

By qzivli at 25 天前 • 0人收藏 • 58人看过

如果键key之前不存在于ht中,就将key的值设为value;如果已经存在,则把key的值和新的值value传给过程proc,将proc的返回值更新到key。需要注意的是proc的参数顺序:

(proc old-value value)
(define (hashtable-merge! ht key proc value)
  (if (hashtable-contains? ht key)
      (let ([old-value (hashtable-ref ht key #f)])
        (hashtable-set! ht key (proc old-value value)))
      (hashtable-set! ht key value)))
      
(define ht (make-hashtable string-hash string=?))
(hashtable-set! ht "Alice" 1)
(hashtable-merge! ht "Alice" + 1)
(hashtable-merge! ht "Bob" + 1)
(hashtable-ref ht "Alice" 0) ; 2
(hashtable-ref ht "Bob" 0)   ; 1


这应该是一个比较常用的模式,但是R6RS标准库里并没有定义。

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...