1 つ以上の式を取り、それらの式を順番に実行する関数を実装する必要があります。
これは私がこれまでに持っているものです:
(define (foo exp0 exp1 ) exp0 exp1)
1 つ以上の式を取り、それらの式を順番に実行する関数を実装する必要があります。
これは私がこれまでに持っているものです:
(define (foo exp0 exp1 ) exp0 exp1)
スキームは特定の引数の評価順序を指定しません。display-and-return
これは、関数がある場合、次のことを意味します。
(define (display-and-return x)
(display x)
x)
次に、たとえば次のように呼び出します。
(list (display-and-return 1) (display-and-return 2))
結果が得られることが保証されていますが、display によって生成された出力が またはのいずれかとして表示される可能(1 2)
性があります。ただし、Scheme では、関数の本体が評価される前に関数への引数が評価されるように指定されています。そのため、2 つの式を関数の引数にすることで、これらの式を並べることができます。12
21
((lambda (val1)
((lambda (val2)
(list val1 val2))
(display-and-return 2)))
(display-and-return 1))
一般に、このような変換を使用して(seq exp1 exp2 ... expm expn)
、
((lambda (val1)
((lambda (val2)
...
((lambda (valm)
expn) ; or ((lambda (valn) valn) expn)
expm) ... )
exp2))
exp1)
を使用して、そのような変換を定義できますdefine-syntax-rule
。
「1つ以上の式」を取り、それらを評価して最後のものを返すものが必要です。これは次のように定義できます。
(define (sequence exp1 . exps)
(car (reverse (cons exp1 exps)))) ; (if (null? exps) exp1 ...)
次に、次のように呼び出します。
> (sequence (+ 1 2) (* 1 2) 17)
17
標準関数アプリケーションは「これらの式を順番に実行する」ため、定義構文を使用する必要はありません
順序を左から右に保証する必要がある場合は、次のものが必要です。
(define-syntax sequence
(syntax-rules ()
((sequence exp exps ...)
(begin exp expos ...))))
ただし、 を使用できないbegin
が を使用できる場合は、次のようlambda
になります。
(define-syntax sequence
(syntax-rules ()
((sequence exp exps ...)
((lambda () exp exps ...)))))