Syntax Scheme Switch语句语法

Syntax Scheme Switch语句语法,syntax,switch-statement,scheme,Syntax,Switch Statement,Scheme,在Scheme中创建switch语句最聪明的方法是什么 我想将一个值与其他几个值进行比较,如果一个值的结果为true,则整个函数的结果应为true,否则为false。我不太熟悉scheme中的语法。在scheme中,您有: 正如您所看到的,它与文本数据进行比较。因此,您无法将该值与其他变量进行比较。然后您需要对每个值进行显式比较的替代方法是使用成员: > (define (vowel? x) (member x '(a e i o u)) > (vowel? 'b) #f 基本情况

在Scheme中创建switch语句最聪明的方法是什么

我想将一个值与其他几个值进行比较,如果一个值的结果为true,则整个函数的结果应为true,否则为false。我不太熟悉scheme中的语法。

在scheme中,您有:


正如您所看到的,它与文本数据进行比较。因此,您无法将该值与其他变量进行比较。然后您需要

对每个值进行显式比较的替代方法是使用
成员

> (define (vowel? x) (member x '(a e i o u))
> (vowel? 'b)
#f
基本情况 通常,如果您想要返回布尔值,一个简单的布尔表达式就足够了。在简单的情况下,在
中进行几次检查就足够了:

(define (switch val)
  (or (equal? val 'some-value)
      (equal? val 'some-other-value)
      (equal? val 'yet-another-value)))
高阶函数 我们经常这样做,这需要大量的工作,因此我们可以创建一个名为
make switch
的函数,它获取一个值列表并返回一个函数,该函数用作这些值的switch语句:

(define (make-switch list-of-vals)
  (define (custom-switch val)
    (define (inner vals)
      (cond ((null? vals) #f)
            ((equal? val (first vals)) #t)
            (else
             (inner (rest vals)))))
    (inner list-of-vals))
然后我们可以像这样使用
make开关

> (define k (make-switch '(1 2 a "b")))
> (k 1)
#t
> (k 5)
#f
> (k "a")
#f
> (k "b")
#t
更快的查找 如果我们主要是针对一组静态值进行检查,那么哈希表是另一种选择。
#lang racket
中的代码显示了一般方法,R5RS方案可以使用SRFI-69:

#lang racket
(define (make-switch alist)
  (define (list->hash alist)
    (make-hash (map (lambda (x) (cons x x))
                    alist)))
  (lambda (val)
    (if (hash-ref (list->hash alist) val #f)
        #t
        #f)))
注 在某些情况下,您可能希望使用
eq?
或其他一些相等性测试,但我将
makecustommakeswitch
留作进一步探讨的练习

#lang racket
(define (make-switch alist)
  (define (list->hash alist)
    (make-hash (map (lambda (x) (cons x x))
                    alist)))
  (lambda (val)
    (if (hash-ref (list->hash alist) val #f)
        #t
        #f)))