なぜ小さなスキーマーのすべてのラムダがありますか?
-
23-10-2019 - |
質問
SICPから少しのスキームを学んだ後、私は小さなスキーマー(私は非常に面白いと思う)を読み始め、約4分の1が完了しました。私はラムダを使用せずに多くの(ほとんど?すべて?)ソリューションを書くことができることに気づきましたが、小さなスキーマーは いつも それらを使用します。たとえば、最初の定義はです
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
私が間違っていない限り、これはより簡単に書くことができます
(define (atom? x)
(and (not (pair? x)) (not (null? x))))
Lambdaのないソリューションを書くと、基本的なものがありませんか?
解決
元は、 define
変数を値に設定するための単一の構文がありました。それは、そのような古い(そして時代を超越した)本で使用されているスタイルです。後で、 define
ショートカットとして別の構文を取得しました。これはあなたが使用しているものです。
楽しみのために、スキームライブラリを検索すると、非ラムダのフォームを古いラムダが多いものに拡張するマクロが見つかるかもしれません。
他のヒント
私は強く好みます lambda
- ジェイが言うように、関数の創造をより明確にするため、教育のための豊かなスタイル。
学習するとき、あなたが始めて始める単純な機能 atom?
それは define
DトップレベルでD。これは、で機能を作成することが可能であり、さらにコンパクトなことを意味します defun
-スタイル define
あなたは言及します。
ただし、第一クラスの値として関数を使用し始めると、例えば、 map
, 、あなたは見るでしょう lambda
初めて、それは実際よりも奇妙で魔法のように思えるかもしれません。
代わりに、機能を定義している場合 lambda
ずっと、関数が他の価値とまったく同じであることを確認するのは飛躍的ではありません。彼らはたまたま右側にいます define
かなり頻繁にですが、数値または引用定数と違いはありません:
(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))
もちろん、言語は両方のフォームをサポートするため、最終的にはスタイルになります。私には、の使用には魅力的な一貫性があります define
すべての機能が作成されている場合 lambda
: :最初の引数は常にシンボルであり、2番目の引数は単なる古い表現です。そしてその事実 lambda
古い表現は、機能的なプログラマーが学習するための最も重要なことの1つです。
あなたのスキームがこれらのショートカット(マクロ)を使用するように拡大するものを見ることができます expand
(サポートされている場合):
mzscheme 4.2.4(drschemeを使用):
> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
(add1)
(lambda (x) (apply + '1 x)))
Chezスキーム8.0:
> (expand '(define (add1 x) (+ 1 x)))
(begin
(set! add1
(lambda (x)
(+ 1 x)))
(void))
lambda
日のように平凡に見えます。
私は教授がこのようなことを話し合ったことを漠然と覚えています。
Lambdaソリューションは2つの理由で使用されていると思います。
最初は純粋に歴史的なものです。ある時点で、それが可能だった唯一の方法でした。そのため、一部の人々はまだその方法を使用しています。
2つ目は、一部の人々は、関数が作成されているという事実についてより明確になりたいので、ラムダという言葉を見たいということです。
ですから、この選択は、あなたが個人的に一番好きなものに帰着すると思います。
TLSを使用して、Lambda Calculus(Simon Peyton Jonesによる「機能プログラミング言語の実装」、無料のPDFオンライン)について少し読んでいます。これは単なる推測ですが、TLSの著者はあなたがあなたの思考において本当にラムダが多いことを望んでいると思います。彼らは出てきてそれを言うことはありませんが、これはすべてApplied Lambda Calcの単なる演習であるというヒントがあります(TLSの107ページをチェックしてください)。だから、彼らは「あなたはラムダの抽象化をしている、私の友人だ!」と言っていないかもしれません。
リトルスキーマーは、擬似コードスキームを使用しています(教育目的で単純化し、実装に依存するために)。今日の標準スキームには、Lambdaを暗黙的に呼び出している定義の定義があります(参照 http://www.cs.cmu.edu/groups/ai/html/r4rs/r4rs_7.html)。リトルスキーマースキームは非常にシンプルで、この代替フォームは含まれていません。