在没有条件的情况下将Scheme / Racket中的boolean转换为整数?

时间:2014-11-05 22:55:30

标签: scheme racket

是否可以在不使用condif的情况下将布尔值转换为0或1?我该怎么做?

例如,(f true) -> 1(f false) -> 0

编辑:我忘了提及我使用intermediate student with lambda

4 个答案:

答案 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行为。由于奇怪的原因,memqmember会返回布尔值。

以下答案适用于标准Scheme(对于count解决方案,使用SRFI 1)。


当然,

ÓscarLópez的回答是正确的,但orand实际上是最终扩展为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))))