問題タブ [let-over-lambda]
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.
macros - マクロを書き込むマクロ - コンパイル エラー
次のコードをコンパイルすると、SBCL は g!-unit-value と g!-unit が定義されていないと文句を言います。これをデバッグする方法がわかりません。私が知る限り、フラット化は失敗しています。
flatten が defunit の引用符で囲まれていない部分に到達すると、その部分全体がアトムとして扱われているように見えます。その音は正しいですか?
以下は、本Let over Lambdaのコードを使用しています。
ポール・グラハム・ユーティリティ
Let Over Lambda ユーティリティ - 第 3 章
Let Over Lambda - 章 5
common-lisp - common lisp: let-over-lambda テストの実行方法
私は Doug Hoyte と The Phoeron の let-over-lambda の例を使用して、common-lisp パッケージ、quicklisp と asdf、および Common Lisp で大規模にプログラミングするための製品レベルの専門的な実践についての理解を同時に深めています。
以下に示す方法でパッケージを使用できますが、同様の部分的にガイドされた推測を使用してテストを実行する方法をまだ理解していません. 詳細は次のとおりです。
ここでコードを見つけました: https://github.com/thephoeron/let-over-lambda。私は「消防ホース」と「漸進的に教育された当て推量」のアプローチを使用して、これをトレイルガイドとして使用して、できるだけ早く頭に詰め込みます。もちろん、このアプローチでは、より構造化されたアプローチよりも多くのあいまいな知識が途中で残されますが、より早く山頂にたどり着く可能性があります (この概念について私を誤解させてください)。
私の現在の初歩的なレベルの理解では、自分のコードでパッケージを使用できます。たとえば、私は書くことができます
(load "~/quickload/setup.lisp")
(ql:quickload "let-over-lambda")
(let-overlambda:flatten '((a . b) c (d e)))
そして得る
「package.lisp」lol
の を読むと、パッケージがニックネーム を定義していることがわかります。つまり、(省略形):defpackage
(defpackage #:let-over-lambda
(:nicknames #:lol)
(:use #:cl #:cl-user #:cl-ppcre)
次のニックネームを使用できます。
さらに、そのエクスポートをインポートして、シンボルを修飾する必要をなくします:
ここで、レポに興味をそそるテスト パッケージとディレクトリ "t" が含まれていることに気付きました。
-rw-r--r-- 1 921 Dec 5 05:27 let-over-lambda-test.asd
-rw-r--r-- 1 941 Dec 5 05:27 let-over-lambda.asd
-rw-r--r-- 1 17421 Dec 5 05:27 let-over-lambda.lisp
-rw-r--r-- 1 1771 Dec 5 05:27 package.lisp
drwxr-xr-x 3 102 Dec 5 05:27 t
ただし、テストの実行方法がわかりませんでした。それが私の質問です。どうすればよいのでしょうか? 以下は、私が sbcl 1.3.1 で試みたがうまくいかなかったもののいくつかです:
この
編集:次のように「証明」をクイックロードすると、環境にさらに多くのクールなものがロードされましたが、テストの実行方法がわからないままでした。「prove」は「let-over-lambda-test」の依存関係として自動的にクイックロードされると思っていたdefsystem
ので、これはちょっとした驚きでした:
ご指導いただければ幸いです。
lambda - スキームのlet-over-lambda?
Common Lisp では、2 つの関数で状態を共有したい場合、次のようにlet over ラムダを実行します。
これらの関数は に対してローカルではありません。let
共有状態変数への参照を維持するグローバル関数であり、それ自体は外部からは見えません。たとえば、コードの別の場所で次のことを行うことができます。
しかし、Scheme では、そのような構造は、外部からは見えないローカル関数を宣言します。
この種の機能を実現するために私が考えることができる唯一の方法 (モジュール内でエクスポートされていないグローバルを使用することを除く) は、次のようになります。
そのような醜い回避策に頼ることなく、 let-over-lambdaフォームを書く方法は Scheme にありますか? それとも、この醜さをラップするマクロを書く必要がありますか? (ところで、私は について知っていletrec
ますが、それはこの問題の解決策ではありません。)
ちなみに、私はチキンスキームを使用していますが、私の質問はすべてのスキームに関連するはずです。
closures - Pandoric マクロのシンボルをコンパイルするにはどうすればよいですか?
私はLOLのセクション 6.7 を数回読んだことがありますが、まだ次のことが頭に浮かびません。
以前は外部コードに対して閉じられていたバインディングは、それらのバインディングが効率的なものにコンパイルされ、長い間アクセサー シンボルが忘れられていたとしても、いじくり回せるように広く開かれています。
バインドされたシンボルが本質的にクロージャーの環境でポインターにコンパイルされる場合、どのようにしてシンボルを既にコンパイルされた関数に渡し、関数は何らかの方法でシンボルを比較できますか?
私はpantest
clisp の例をいじっていますが、acc
とthis
内部の両方を変更できることがわかりpantest
ます。をコンパイルおよび逆アセンブルできますpantest
が、すべてのシンボルが環境に表示されます。アセンブリにコンパイルされた Lisp があれば、もう少し直感的に理解できるかもしれませんが、コードが複雑すぎて、説明なしで理解するのはおそらく難しすぎるでしょう。
macros - 本 Let over Lambda の sortf でバインドされている 'a1' はどこにありますか?
Doug Hoyte による本「Let over Lambda」では、ソート ネットワークを介した固定サイズの入力の高速ソート関数について説明しています。
'(car a1)' と '(cadr a1)' という式の記号 'a1' はどこから来たのですか?
ところで。「デフマクロ!」'gensym' を介して新しいシンボルを作成するために 'g!{symbol}' 構文を導入するマクロを定義するマクロです。そして、'build-batcher-sn' は、Batcher のアルゴリズムを使用してソーティング ネットワークを構築します。