哪一种数据类型最适合多个 key 对应于同一个 value 的情形?

如题,比如: (“kilometre” “km” “千米”) 的对应值都是 “km”

如果有很多这样的 key value pair 时,用那种比较合适? hash table? association list?p-list ?还是 list?

好吧,因为列表里的字符都是用来匹配的,所以我干脆用 regexp-opt 将它生成一个正则表达式,再用正则表达式匹配。

当然原来的问题依然有效,我还是很想知道 elisp 中什么样的数据类型可以实现多个 key 对同一 value。

正则应该是正解。

非String类型的定义Alias,用eval。

能不能举一个具体的例子?谢谢

取决于你需要怎么用?如果需求不存在的话, 可以不用想解决方案。

;; keys               internal keys         value
;; -----------      ------------------      -------
;; "kilometre" ->   "_internal_key_1_" \
;; "km"        ->   "_internal_key_1_"  >   1000
;; "千米"      ->   "_internal_key_1_" /

(set "kilometer" 1000)          ;; 如果不存在 internal key 就创建一个

(associate "kilometer" "km" )   ;; 关联
(get "km")                      ;; => 1000
(set "km" 2000)

(associate "kilometer" "千米" ) ;; 关联
(get "千米")                    ;; => 2000

(dissociate "km" 3000)          ;; 分裂,使用新的 internal key,并写入新值或拷贝原来的值
(get "km")                      ;; => 3000

函数名乱写的

1 个赞

需求仍然存在

这算是 alist 和 plist 结合使用吗?

你需要解释你要怎么用?

另外尽量一次性把东西讲清楚,我们不是在聊天。

就是我通过函数取得一个字符串,这个字符串作为 key 来查找对应的 value,value的值也是字符串。

而同一个 value 可以有多个 key 对应。比如我最开始举得那个例子。

或者可以这样理解,我所得到的字符串如果是某个列表的成员,就返回这个列表对应的值。

associate 是什么?我的emacs上没有这个函数?

好吧,刚看见

能不能给一个真正可以 work 的例子,我没太理解你的意思。

我好像知道怎么办了。

cl-case 可以得到我所需要的效果

可是这样的话带来的一个后果就是函数本身会写很长。而不是我所钟意的变量和函数分开写的方式。

你可能需要用宏把代码转成更简洁的格式。

我找到了更好的解决方案,用 cl-loop

common lisp 对于我来讲真是一块未知领域,cl-loop 很好很强大。

loop 可能是CL里面最魔幻的宏了。

确实很魔幻 :joy: