检查参数是列表还是原子

发布于 2024-10-25 20:37:46 字数 73 浏览 3 评论 0原文

如何检查某物是否是原子?我正在寻找类似 number?list? 的内容。

How do I check if something is an atom? I'm looking for something like number? or list?.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谈情不如逗狗 2024-11-01 20:37:46

通常,您也想排除空列表:

(define (atom? x) (not (or (pair? x) (null? x))))

或者,如果您想更加迂腐,那么也禁止向量:

(define (atom? x) (not (or (pair? x) (null? x) (vector? x))))

当然您可以在此处添加更多内容 - 因为它被标记为球拍问题,您可能想要添加哈希表、结构体等。因此,指定您视为原子的值的种类也可以更容易:

(define (atom? x)
   (ormap (lambda (p) (p x)) (list number? symbol? boolean? string?)))

或使用球拍合约系统:

(define atom? (or/c number? symbol? boolean? string?))

Usually, you'll want to exclude the empty list too:

(define (atom? x) (not (or (pair? x) (null? x))))

or, if you want to be more pedantic, then forbid vectors too:

(define (atom? x) (not (or (pair? x) (null? x) (vector? x))))

And of course you can add much more here -- since it's marked as a racket question, you might want to add hash tables, structs, etc etc. So it can just as well be easier to specify the kinds of values that you do consider as atoms:

(define (atom? x)
   (ormap (lambda (p) (p x)) (list number? symbol? boolean? string?)))

or using the racket contract system:

(define atom? (or/c number? symbol? boolean? string?))
傲世九天 2024-11-01 20:37:46

当各种方案不包含它时,我经常看到 atom? 是这样定义的:

(define (atom? x) (not (pair? x)))

如果 x 不是一对(或列表),则返回 true。它将为数字、字符串、字符和符号返回 true,而 symbol? 自然只会为符号返回 true。这可能是也可能不是您想要的。比较 Yasir Arsanukaev 的示例:

1 ]=> (map atom? (list 42 'a-symbol (list 12 13) 'foo "yiye!"))

;Value 13: (#t #t #f #t #t)

它使用 pair? 因为这会检查 (1 2 3) 等正确列表,以及 (a . b) 等对,而 list? 对于点对和点尾列表将返回 false。

When various Schemes don't include it, I've often seen atom? defined this way:

(define (atom? x) (not (pair? x)))

This will return true if x is not a pair (or a list). It will return true for numbers, strings, characters, and symbols, while symbol? will only return true for symbols, naturally. This might or might not be what you want. Compare Yasir Arsanukaev's example:

1 ]=> (map atom? (list 42 'a-symbol (list 12 13) 'foo "yiye!"))

;Value 13: (#t #t #f #t #t)

It uses pair? because this checks for proper lists like (1 2 3), pairs like (a . b), while list? will return false for dotted pairs and dotted-tail lists.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文