扩展 dash -let 实现类似 let-alist 的特性

目前的 -let 不能像 let-alist 那样读取嵌套列表的值,但 let-alist. 作为分隔符的写法也有点奇怪,不支持 string 类型的 key(例如 .a."b"),而且不支持 alist 之外的列表。

我试着扩展了一下 -let,实现列表(包括 alist/plist/hash)的嵌套读取,主要是想看看是否可行,更期待 dash 官方的实现。

代码略长(包含测试)就不贴了,放在 https://gist.github.com/twlz0ne/6b9549890241e42f5d6b09d2f4e56d54

用例:

(-let [(&alist '(a "b" c) v) '((a . (("b" . ((c . 3))))))] v)
;; => (let* ((v (cdr (assoc 'c
;;               (cdr (assoc "b"
;;                (cdr (assoc 'a
;;                 '((a . (("b" . ((c . 3))))))))))))))
;;      v)
;; => 3

(-let [(&alist '(a "b") v) '((a . (("b" . ((c . 3))))))] v)
;; => (let* ((v (cdr (assoc "b"
;;               (cdr (assoc 'a 
;;                '((a . (("b" . ((c . 3))))))))))))
;;      v)
;; => '((c . 3))

(-let [(&alist 'a v) '((a . (("b" . ((c . 3))))))] v)
;; => '(("b" . ((c . 3))))

reader 不允许,会读成两个 Lisp expression。

let-alist 中的 alist 而且 key 必须是符号,有了这样的限制,导致 let-alist 实现容易,使用起来也简单。