或作为计划中的程序

Mis*_*Tek 3 macros scheme functional-programming variadic-functions apply

我想应用于or列表的每个元素,例如: (apply or '(#t #t #f))预期结果#t,但我收到错误:

'#'到'apply'的类型错误(kawa.lang.Macro)(预期:过程,序列或其他运算符)

据我所知,or这不是一个程序. 有没有可以用来代替的程序or

Ale*_*uth 5

最简单的方法是使用exists*.无论何时使用(apply or some-list),都可以使用(exists values some-list).或者如果您愿意,可以定义一个exists用于执行此操作的函数:

#!r6rs
(import (rnrs base)
        (rnrs lists))

(define (or* . lst)
  (exists values lst))
Run Code Online (Sandbox Code Playgroud)

values是身份功能,所以(values x)只是x.

exists是一个定义的高阶函数,(exists f (list x ...))相当于(or (f x) ...).

例如(exists values (list #t #t #f))相当于(or (values #t) (values #t) (values #f)),与之相同(or #t #t #f).

尝试一下:

> (apply or* '(#t #t #f))
#t
> (apply or* '(#f #f #f))
#f
> (or* #t #t #f)
#t
> (or*)
#f
Run Code Online (Sandbox Code Playgroud)

*exists有时被称为ormapany


Syl*_*ter 5

SRFI-1名单库,你有everyany这基本上是andor用于在列表中的程序。

#!r6rs

(import (rnrs base)
        (only (srfi :1) every any)

(define num1-10 '(1 2 3 4 5 6 7 8 9 10))
(define odd1-9 '(1 3 5 7 9))

(every odd? num1-10) ; ==> #f
(any odd? num1-10)   ; ==> #t
(every odd? odd1-9)  ; ==> #t
Run Code Online (Sandbox Code Playgroud)

对于布尔值列表,过程只需要返回参数。values返回它的参数并作为身份:

(define booleans '(#f #t))
(every values booleans) ; ==> #f
(any values booleans)   ; ==> #t
Run Code Online (Sandbox Code Playgroud)

SRFI-1 是一个安全的选择,因为它是即将推出的 R7RS Red 版本的列表库。在许多 R5RS 和 R6RS 实现中都包含了 SRFI-1,如果没有,您可以轻松地从 SRFI 参考实现中添加它。在 DrRacket 的默认语言 DrRacket 中,它具有ormapandmap,您可以选择使用 SRFI-1 来代替(require srfi/1).