我正在进行一些文本处理,其中一部分是将单词分成单个字符。每个角色都以大写字母作为符号实例化,只是为了方便起见而赋予它一些频率值,但正如人们可能想象的那样,T常量形式存在一个绊脚石。
我现在看的解决方案是简单地使用小写符号而不是大写字母T,但是我想知道是否有一种快速简便的方法来验证手头的符号是否为T.
我能想到的只有:
(实习生(如果(字符串=“T”(符号名称符号))#\ t \ t符号)
但这看起来不太好,因为字符串比较并不麻烦。有什么想法吗?
PS。我需要大写的所有符号,因为在听众中评估它们不那么麻烦,但我可以使用一个小写t。
答案 0 :(得分:5)
您应该使用hash table而不是将当前的包破解为临时包。它完全回避了T问题,是一个更清洁的解决方案。
如果需要考虑简洁,你可以使用像(defun frequency (char) (gethash char the-table))
这样的函数,你应该在代码的主体中使用它,因为除了缩短它之外,它意味着你的代码用“频率”来编写字符“而不是”在哈希表中查找值。“
如果您正在为REPL寻找极致的键盘极简主义,那么您可以定义一个阅读器宏,例如:
(set-macro-character #\?
(lambda (stream char)
(declare (ignore char))
(let ((char (read stream)))
`(frequency (character ',char))))
t)
我猜你可能完全不理解,但是你可以用?A
之类的东西来检查#\ A的频率。
无论如何,关键在于编写能够简单明了地实现其目标的代码,并与良好的风格和“最佳实践”保持一致,因为如果你想要一些特殊用途的东西,比如在REPL中打字少,你可以总是堆在另一个抽象层上。
答案 1 :(得分:0)