如何检查符号是否为T?

时间:2012-01-13 23:15:04

标签: lisp common-lisp

我正在进行一些文本处理,其中一部分是将单词分成单个字符。每个角色都以大写字母作为符号实例化,只是为了方便起见而赋予它一些频率值,但正如人们可能想象的那样,T常量形式存在一个绊脚石。

我现在看的解决方案是简单地使用小写符号而不是大写字母T,但是我想知道是否有一种快速简便的方法来验证手头的符号是否为T.

我能想到的只有:

(实习生(如果(字符串=“T”(符号名称符号))#\ t \ t符号)

但这看起来不太好,因为字符串比较并不麻烦。有什么想法吗?

PS。我需要大写的所有符号,因为在听众中评估它们不那么麻烦,但我可以使用一个小写t。

2 个答案:

答案 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)

您可以shadow符号T

CL-USER> (shadow 't)
COMMON-LISP:T
CL-USER> (let ((t 17)) t)
17

阴影常量T仍可称为cl:t