Syntax Scheme Switch语句语法
在Scheme中创建switch语句最聪明的方法是什么 我想将一个值与其他几个值进行比较,如果一个值的结果为true,则整个函数的结果应为true,否则为false。我不太熟悉scheme中的语法。在scheme中,您有: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 基本情况
正如您所看到的,它与文本数据进行比较。因此,您无法将该值与其他变量进行比较。然后您需要对每个值进行显式比较的替代方法是使用
成员
:
> (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)))