编译期已知键值对的高效无重复双向查找实现及常量列表最优查找方案问询
编译期已知键值对的高效无重复双向查找实现及常量列表最优查找方案问询
嘿,我最近碰到这么个场景:手里有一批编译期就能确定的键值对,不想在运行时做动态查表,而是希望直接生成编译好的静态查找表——就像我昨天写的这段Common Lisp代码一样:
(defun mod-mask (char) (case char (#\A #.(ash 1 22)) (#\s #.(ash 1 23)) (#\H #.(ash 1 24)) (#\S #.(ash 1 25)) (#\C #.(ash 1 26)) (#\M #.(ash 1 27)))) (defun mask-mod (mask) (case mask (#.(ash 1 22) #\A) (#.(ash 1 23) #\s) (#.(ash 1 24) #\H) (#.(ash 1 25) #\S) (#.(ash 1 26) #\C) (#.(ash 1 27) #\M)))
当然了,写这种重复代码实在是太无聊了(玩笑归玩笑),而且上面的例子只是键值对很少的情况——要是有几十上百个键值对,手动写双向的case分支不仅繁琐,还特别容易出错。另外,用一个统一的列表来存这些键值对的话,我们还能随时查看已定义了哪些元素,但编译后的case分支就没法直接获取这类信息了。
所以我想请教各位:有没有什么优雅的办法,既能避免重复编写双向查找的代码,在编译期生成高效的静态查找逻辑,又能保留一个可维护的统一键值对列表,方便后续查看和修改?
备注:内容来源于stack exchange,提问作者myname
相关产品推荐
相关产品推荐

