我有一个列表`(+ 1 2 3 a b c)
我想检查一个元素是否是一个字母。
(symbol? (list-ref mylist idx))
会为#t
和a
返回+
,这是我不想要的。
也许我可以将元素与[a-zA-z]
进行比较,或者检查它是否为[+-*/]
的符号,但这看起来很乏味。
这是怎么做到的?
更新
实际上,我可以写自己的功能。
(define is-letter
(lambda (c)
(if (and (not (number? c))
(not (eq? c `+)) (not (eq? c `-)) (not (eq? c `*)) (not (eq? c '/)))
#t
#f
)
)
)
答案 0 :(得分:3)
鉴于您打算使用带引号的列表,这里有一个可能的解决方案,它通过将符号转换为字符串然后检查条件来工作:
(define (is-single-letter? x)
(if (number? x)
#f
(let ((s (symbol->string x)))
(and (= (string-length s) 1)
(char-alphabetic? (string-ref s 0))))))
例如:
(define mylist '(+ 1 2 3 a b c xxx))
(is-single-letter? (list-ref mylist 0)) ; + is an operator
=> #f
(is-single-letter? (list-ref mylist 2)) ; 2 is a number
=> #f
(is-single-letter? (list-ref mylist 4)) ; a is a single letter
=> #t
(is-single-letter? (list-ref mylist 7)) ; xxx is not a single letter
=> #f