問題タブ [htdp]
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.
scheme - PLT-Scheme 学習リファレンス
2冊のSchemerの本を読み終えた後、私はHtDPに着手しようとしていますが、http://docs.plt-scheme.org/guide資料も発見しました。
前述の書籍は、Scheme に特化しているようで、後者は PLT 固有の拡張機能 (モジュール、require、ブラケット構文など) を対象としています。オンライン マニュアルは優れていますが、購入できるブック フォームがあることを期待していましたか?
そうでない場合、私は確かに詳細なオンライン マニュアルに感謝しています - ただ興味がありました!
scheme - append を使用して 2 つのリストを同時に処理する
HTDPの演習 17.1.2 の質問に行き詰まっています。これは私がこれまでに得たものです:
これはテスト ケースでは機能しますが、2 番目のリストに 2 つ以上の要素がある場合、関数は崩壊します。
2 番目のリストから最大 2 つの要素をコンスするだけなので、問題は追加後の 2 行目にあるようです。これを解決するにはどうすればよいですか?洞察をありがとう。:)
scheme - ラケット/スキームでのローカルの使用
htdp の演習 18.1.12 で、 "local" を使用して maxi 関数を書き直しました。
本のバージョンはより短く、より明確で、おそらくより高速であるように見えるので、なぜ「実生活」でこれを行うのかわかりません。
それは純粋に教育的な演習を意図したものでしたか? 経験豊富なSchemerが上記のコードについてコメントできますか? ありがとうございました。
scheme - Racket/Scheme でのフィルター、マップ、ビルドリスト、およびローカル関数の慣用的な使用法?
私は自分で HtDP の演習 21.2.3を実行していますが、これがさまざまな関数の慣用的な使用法であるかどうか疑問に思っていました。これは私がこれまでに持っているものです:
私の初心者の目には、同じ長さの2つのリストが必要なbuild-list
ため、ローカル関数を定義して機能させる必要があるため、かなり醜いように見えます。map
読みやすさのためにこれを改善できますか?ありがとうございました。
user-interface - Racket/PLT-Scheme でボタンのラベルを取得するには?
HtDP から演習 22.3.3 を試みていますが、クリックされたボタンのラベルを取得する方法がわかりません。draw-message: expected <string> as second argument, given: (instantiate (class ...) ...)
文字列が必要であることを示唆しているように見えるこのメッセージが表示されますが、クラスのインスタンスを取得しています。答えはコールバックにありますか? もしそうなら、どうすればそれを分解できますか?
これは私がこれまでに持っているものです:
正しく理解していれば、各ボタンcall-back
は押されたときに呼び出されます。display
これは、テキストを更新する呼び出しを行う必要があります。ただし、発信者のラベルを取得する方法がわかりません。たとえば、ボタン「9」を押すと、 が呼び出されますcall-back
。しかし、値「9」を取得するにはどうすればよいですか? これは私が確信していないことです。
scheme - バックトラック無限ループ
これはHtDP の演習 28.1.2です。関数の実装に成功しneighbors
、すべてのテスト ケースに合格しました。
テキストからコードをコピーして貼り付けると、問題が発生Figure 77
します。宛先ノードが起点ノードから到達可能かどうかを判断することになっています。ただし、起点と終点のノードが同じであるという最も些細なケースを除いて、コードは無限ループに入るように見えます。
問題は私のコードにありますか? ありがとうございました。
scheme - ローカルとラムダの慣用的な使用法?
HtDP の演習 30.1.1では、質問に答えるために使用を開始し、local
使用するように変更しました。lambda
と
この特定の例では、local
バージョンの方が読みやすいと思います。lambda
バージョンが優先される状況はありますか? ありがとうございました。
scheme - 再帰とアキュムレータスタイルのパフォーマンス
与えられた数の階乗を計算する2つの関数があります。最初のもの!
は、アキュムレータスタイルを使用します。2番目の、fact
は、自然再帰を使用します。
と
セクション31の下部で、HtDPは、自然再帰バージョンは、アキュムレータバージョンよりも高速ではないにしても、多くの場合高速であると述べていますが、その理由については述べていません。これについて読んだところ、答えは「末尾呼び出しの最適化/削除」のようですが、ウィキペディアの記事は、少なくともパフォーマンスに関しては、HtDPの発言と矛盾しているようです。なんでそうなの?
職場では、再帰的なスタイルの方が高速です。自宅では、アキュムレータスタイルの方が高速です。どのスタイルが一般的に好まれるのかを選択するための一般的なヒューリスティックはありませんか?アキュムレータスタイルの方がメモリ効率が高いことは理解していますが、議論をパフォーマンスだけに限定すると、少なくとも私にはわかりません。どちらがより良い選択です。
私はこれについてもう少し考えましたが、一般的な場合のアキュムレータスタイルの再帰の優位性に関するウィキペディアの記事を支持する必要があります。スタック/ヒープスペースの使用量を削減するだけでなく、メモリアクセスは常にレジスタアクセスの背後にあり、マルチコアがここにあることをより明確にすることができます。それでも、HtDPは、すべての場合に実際のテストが必要であることを証明しています。
scheme - `set!` を使用して Racket の副作用を無視するには?
HtDPの演習 35.4.2では、GUI を実装し、コールバック関数を呼び出す「削除」というボタンを用意しました。ここにあります:
これを実行すると、次のメッセージが表示されますbutton-callback: result of type <Boolean> expected, your function produced #<set!-result>
。問題はset!
、アドレス帳を変更するために電話しなければならないことです。ただし、 is の結果set!
は(void)
、ブール型と組み合わせることはできません。この問題を回避するにはどうすればよいですか? 洞察をありがとう。
scheme - #lang スキームと #lang ラケットの違い
#lang racket は、すぐに使える構造と一般的な機能をはるかに備えたスキームの方言であり、おそらくより教育的であると推測しています。#langスキームに対する#langラケットの特典は何ですか?
ラケットで #lang スキームを使用して、「コンピュータープログラムの構造と解釈」または「プログラムの設計方法」のすべての内容に従うのが最善ですか(または可能ですか)。HtDP は #lang ラケット固有ですか?
ライブラリが含まれていない限り、#lang スキームで記述されたコードは、チキン スキームまたは任意のメイン インタープリターで使用できますか?
前もって感謝します。