問題タブ [the-little-schemer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
lambda - なぜリトルスキームのすべてのラムダ?
SICPからSchemeを少し学んだ後、The Little Schemer(非常に面白いと思います)を読み始め、約4分の1が完了しました。ラムダを使用せずに多くの(ほとんど?すべて?)ソリューションを記述できるのに対し、LittleSchemerは常にそれらを使用していることに気付きました。たとえば、最初の定義は
私が間違っていない限り、これはもっと簡単に次のように書くことができます
ラムダレスソリューションを作成する場合、基本的な何かが欠けていますか?
recursion - The Little Schemer の p.137 の続きの例を説明してください。
問題のコードは次のとおりです。
私はこれを一日中見つめていましたが、まったく理解できないようです。再定義している関数を再利用するcol
と、例では元の定義を使用しているように見えます。どうせ変わらんでしょ。newlat
パラメータとを渡さずに、どうすればそれを繰り返すことができますかseen
。
ピースが欠けているように見えるので、私の質問を説明するのは難しいです。おそらく誰かが本よりも明確なウォークスルーを提供できれば、それがどのように機能するかを理解できるかもしれません.
scheme - 「TheLittleSchemer」のフォームのみを使用してリストをフラット化します
私は(古いCプログラマーとして)Schemeを学ぶためにThe LIttle Schemerを経験しており、演習として、TheLittleSchemerのフォームのみを使用してリストをフラット化する手順を書こうとしました。つまり、、、、、、、、などですが、define
でlambda
はありません。簡単だと思いましたが、解決策が思いつきませんでした。これどうやってするの ?cond
car
cdr
and
or
append
recursion - ClojureのS式のリストに対する再帰
いくつかのコンテキストを設定するために、私はClojureとLisp開発をより一般的に学ぶ過程にあります。Lispへの道のりで、私は現在、関数型プログラミングと再帰ベースのソリューション解決の基盤を固めるために「Little」シリーズに取り組んでいます。「TheLittleSchemer」では、多くの演習を行ってきましたが、それらの一部をClojureに変換するのに少し苦労しています。具体的には、TCOを有効にするために「recur」を使用するように変換するのに苦労しています。たとえば、S式のリスト内に現れるアトムの出現回数をカウントする「occurs *」関数(LittleSchemerから)のClojureベースの実装を次に示します。
基本的に、(occurs 'abc '(abc (def abc) (abc (abc def) (def (((((abc)))))))))
は5と評価されます。明らかな問題は、この定義がスタックフレームを消費し、S式のリストが深すぎるとスタックを爆破することです。
これで、再帰関数をリファクタリングしてアキュムレータパラメータを使用し、再帰呼び出しをテール位置に配置できるようにするオプションを理解しました(TCOを可能にするため)が、このオプションがこのような状況にも適用できるかどうかに苦労しています。
アキュムレータパラメータを使用して「recur」を使用してこれをリファクタリングしようとすると、次のようになります。
ですから、もうすぐそこにいるような気がしますが、完全ではありません。明らかな問題は、リストの先頭がアトムではない私の「else」句です。概念的には、リストの最初の要素を繰り返した結果と、リストの残りの要素を繰り返した結果を合計したいと思います。繰り返しをテール位置に移動できるように、これをリファクタリングする方法について頭の中で苦労しています。
再帰呼び出しをここで適用する必要があるテール位置に配置するための「アキュムレータ」パターンに追加のテクニックはありますか、それとも単に問題がより「基本的」であり、Clojureベースのクリーンなソリューションがないということです。 JVMにはTCOがないためですか?後者の場合、一般的に言えば、S式のリストを繰り返す必要があるClojureプログラムが使用する一般的なパターンは何でしょうか?価値のあることとして、「再帰を怠惰に置き換える」に使用されるマルチメソッドw / lazy-seq手法(Hallowayの「プログラミングClojure」の151ページを参照)を見てきましたが、そのパターンを適用する方法がわかりません。この例では、リストを作成するのではなく、単一の整数値を計算しようとしています。
よろしくお願いします。
scheme - 「TheLittleSchemer」でのYコンビネータの議論
そのため、この関数用に適用可能なYコンビネータが開発されているTheLittleSchemerの第9章の終わりを読んで再読することに多くの時間を費やしましたlength
。私の混乱は、2つのバージョンの長さ(コンビネータが除外される前)を対比する単一のステートメントに要約されると思います。
170ページ(第4版)は、A
引数に適用すると関数を返します
Bが
関数を返しません
これにより、自己アプリケーションの無限後退が発生します。私はこれに困惑しています。Bがこの問題に悩まされている場合、Aがどのようにそれを回避するのかわかりません。
recursion - リトルスキームの偶数のみ*&co
evens-only*&co
145ページのTheLittleSchemerの例で何が起こっているのか理解するのに苦労しています。
コードは次のとおりです。
イニシャルcol
は次のとおりです。
私が得ていないのは、l
asで、それはasとasで'((1) 2 3)
すぐに決勝に進むということです。良いですが、、、から、、、を整理しようとすると、私の心は空白になります。また、ステッパーを実行するためのDrRacket、Chez Scheme、またはMIT-Schemeのセットアップ方法について誰かが私に指導してくれると助かります。else
(car l)
(1)
(cdr l)
(2 3)
dnewl
dproduct
dsum
newl
product
sum
しかし、多分私は早すぎます。これを初めて読む初心者は、実際にこの野生の継続を理解することになっていますか?
scheme - 2つのペア(短所セル)が同じかどうかをテストする
Seasoned Schemerの150ページにある次の関数は、各リストのcdrを変更し、変更が両方に影響したかどうかを確認することで、2つのリストが同じIDを持っている(つまり同じメモリを占有している)かどうかを確認します。
今、私a_list
が次のように定義すると:
と評価する
関数は#fを返し、デバッガー(Dr. Racket)は、これら2つのリスト(2番目の引数は最初の引数の適切なサブセットであるためメンバーのほとんどを共有する必要があります)が実際には異なるコピーを持っていることを確認します同じメンバー。これはどうして可能ですか?!
このアイデアに少しひねりを加えるには:
今a_list
は循環的です。この関数を使用してテストすると、2つの引数、つまりとsame?
が同相の場合にのみ#tが登録されます。 (same? a_list a_list)
(same? a_list (cdddr a_list))
[編集回答は、承認された投稿のコメントチェーンの一番下にあります]
scheme - これら2つのScheme関数の違いは何ですか?
- /li>
(自己追加) => 1
(自己追加) => 2
(自己追加) => 3
(自己追加) => 4
-
2.
(自己追加 1) => 1
(自己追加 1) => 1
(自己追加 1) => 1
上記の2つの機能の違いを理解する方法を教えてください。よろしくお願いします!よろしくお願いします。
scheme - この継続を理解する方法は?
この継続の実行ステップをどのように書くことができますか?
scheme - シフト、整列、シャッフルからどのガイドを取得する必要がありますか?
「The Little Schemer」の第 9 章の冒頭部分に、looking、shift、align、shuffle などの例がいくつかありますが、
p>大ざっぱに理解していると思いますが、これらの例のヒントがわかりません。前提条件が必要かどうか、誰か教えてください。
よろしくお願いします