私はスキームや一般的なLispのに新たなんだ、と学習時に私が結合するローカル・プロシージャで使用される不可解な構文つまずいてきました:それはあることを把握するために私にしばらく時間がかかったローカルプロシージャバインディング
(define mock
(lambda (s)
;; this is what I don't understand
(let splice ([l '()] [m (car s)] [r (cdr s)])
(append
(map (lambda (x) (cons m x)) r)
(if (null? r) '()
(splice (cons m l) (car r) (cdr r)))))))
splice
3つの要素を持つスコープ付きプロシージャです。
(define mock2
(lambda (s)
;; define `splice` first
(define splice
(lambda (la lb lc)
(append
(map (lambda (x) (cons lb x)) lc)
(if (null? lc) '()
(splice (cons lb la) (car lc) (cdr lc))))))
;; bind `splice` and its arguments together and call it with them
(let ([sp splice] [l '()] [m (car s)] [r (cdr s)])
(splice l m r))))
番目のバージョンは少し長く、やや不可欠に見えますが、並行して、それを結合する前に範囲内の通常の手順としてsplice
を定義:ML風のスタイルでこれを書き換えるには、同様の出力を生成しているようです議論(または単にそのままの状態で)をして、それを賢明に見せてください。
質問この2つのバージョンは交換可能ですか?はいの場合、splice
バインディングフォーム内のローカル変数(l
、m
、およびr
)をバインドする最初のバージョンの構文を説明するのに役立ちますか?
'(null?r)'に達するとLを返してはいけません。そうでなければ決して使用されないようです。 – coredump
@coredumpはいそうです。 – PieOhPah