是否可以在不使用cond
或if
的情况下将布尔值转换为0或1?我该怎么做?
例如,(f true) -> 1
和(f false) -> 0
。
编辑:我忘了提及我使用intermediate student with lambda
。
答案 0 :(得分:3)
如果您将库函数视为黑盒子(if
如果在C中实现则不会计数?):
(define (b2i b)
(cadr (assq b '((#t 1) (#f 0)))) )
(b2i #t) ;-> 1
(b2i #f) ;-> 0
答案 1 :(得分:2)
试试这个:
(define (test x)
(or (and x 1) 0))
例如:
(test true)
=> 1
(test false)
=> 0
答案 2 :(得分:2)
编辑:这是一个中级学生解决方案(Leushenko的解决方案也适用于中级学生,偶然;他们也在OP的问题更改之前发布了他们的解决方案):
(define (boolean->integer b)
(sub1 (length (memv b '(#t #f)))))
请注意,在中级学生中,只有memv
具有标准的Scheme行为。由于奇怪的原因,memq
和member
会返回布尔值。
以下答案适用于标准Scheme(对于count
解决方案,使用SRFI 1)。
ÓscarLópez的回答是正确的,但or
和and
实际上是最终扩展为if
的宏。因此,如果这些是不可接受的,我们可以改为使用读取语法:
(define (boolean->integer b)
(define (char-offset x)
(- (char->integer x) (char->integer #\f)))
(define out (open-output-string))
(write b out)
(/ (char-offset (string-ref (get-output-string out) 1))
(char-offset #\t)))
其他更短,但作弊(实际上在幕后分支)答案:
(define (boolean->integer b)
(count values (list b))
或者,灵感来自Leushenko的回答:
(define (boolean->integer b)
(case b
((#f) 0)
((#t) 1)))
答案 3 :(得分:1)
我只是想到了这个:
(define (f b)
(length (remove b '(#f))))