問題タブ [ansi-common-lisp]
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.
common-lisp - common-lisp のオプション引数に関するエラー
SBCL 64 ビット、1.1.7
パッケージを作成し、パッケージ :CL の小さなシンボルを使用する場合は、次のようなパッケージを作成します。
しかし、このパッケージでは、オプションの引数を指定して関数を定義し、オプションの引数を指定せずに呼び出すと、常にエラーが発生します。
マクロを定義すると同じエラーが発生しますが、詳細情報が含まれています。
:CL からいくつかのシンボルが不足しているためだと思いますが、この問題を解決するにはどうすればよいですか? ありがとう。
lisp - x から y へのリストを返す xtoy と呼ばれる Lisp の関数
私はLispが初めてです。整数である 2 つの引数 x と y を取り、x から始まり y で終わる整数のリストを返す x2y という名前の関数を作成しようとしています。
lisp - Common Lisp の #'adjoin は、`:key` と一緒に使用すると、HyperSpec に従って機能しますか?
HyperSpecの #' adjoin のドキュメントを見ると、例のセクションに次のように表示されます。
代わりに、次のことを期待していました。
私の予想は、HyperSpec (17.2.1)の次のテキストによるものです。
オブジェクト O が、次の図にリストされている演算子 F によって、シーケンス S の各要素 Ei に対して反復的に考慮されている場合、S 内の O の存在が F によってテストされる方法を制御すると便利な場合があります。制御は、:test または :test-not 引数で指定された関数に基づいて提供されます。
そしてさらに:
オブジェクト O は Ei と直接比較できない場合があります。:key 引数が指定されている場合、これは各 Ei を引数として呼び出される 1 つの引数の関数の指定子であり、比較に使用されるオブジェクト Zi を生成します。(:key 引数がない場合、Zi は Ei です。)
:key 引数で指定された関数は、O 自体では呼び出されません。ただし、関数が複数のシーケンスで動作する場合 (たとえば、set-difference で発生する場合)、O は、他のシーケンスの要素で :key 関数を呼び出した結果になります。
したがって、slist (シーケンス、S) as'((TEST-ITEM 1))
と O as があり'(new-test-item 1)
ます。O が隣接する必要があるかどうかを確認するために、関数#'cadr
が S の要素に適用されます。最初の要素は'(test-item 1)
です。したがって、そのテストは次のようになります。
ここで、O, ,を S の E1 に( が指定されていない場合に使用される等価関数)'(new-test-item 1)
で適用した結果と照合すると、結果はO が隣接していることを意味するはずです。少なくとも私はそう思います。私は何を誤解していますか?#'cadr
#'eql
:test
false
common-lisp - conses の print-object メソッドの再定義は、異なる CL 実装で異なる影響を与えます。
conses を標準のリスト表記ではなく、常にドット ペアとして出力しようとして、最小限の労力でメソッドを次のように再定義しましたprint-object
。
しかし、その効果は実装によって異なります。
Clozure CL と LispWorks Personal では、結果は私が期待していたものです:
一方、SBCL と AllegroCLexpress では、リストの表示方法に変更はありません。
したがって、これが言語の仕様のあいまいさによるものなのか、そのような動作が未指定として明示的に宣言されているのか、これが REPL とパッケージとの何らかの相互作用によるものなのか、それとも実装があるのかこの定義に関して正しいものと、正しくない他のものがあります。最後に、SLIME 内でこのような定義を行うと、SLIME 自体が完全に破壊されます。
誰かがそのような違いに光を当て、それが存在する場合、私の目的を達成するための問題の少ない別の方法を提案できますか?
algorithm - Lispのグッドプラクティス
私は 2 日前に Lisp の勉強を始めました。Paul Graham の ANSI Common List を読んでいて、言語構造が非常に興味深い方法で公開されています。初心者にとっては理論的すぎず、浅すぎません (個人的に嫌いな Sierra-Bate の Head First Java のように)。簡単な一般的な言語の紹介の後、彼はリストについて話し始め、単純なリスト圧縮の例を挙げます。基本的に、el は n 回繰り返される要素とします。それらすべてを 1 つの (n el) リストに置き換えます。これを行うために、彼はコードの実装を提供しましたが、私は自分で実装しようとしましたが、明らかに機能しています。可能であれば、誰かが私のコードを分析して、その実装の重要なポイントを教えてくれることを望みます。これは、Lisp との最初の接触なので、たくさんあると確信しています。ありがとうございます!
methods - 標準関数でメソッドオブジェクトを呼び出す方法
メソッドオブジェクトを関数として呼び出すにはどうすればよいですか?
Closer-mopとclosパッケージはどちらも、メソッド オブジェクトを関数に変換するためのメソッド関数を提供します。ただし、別のパッケージを含めずにそれを行う方法はありますか? そうでない場合、どのパッケージですか?(SBCLを使用)しかし、パッケージが必要な場合、識別機能はどのようにそれを行いますか?
これは、find-method を使用してメソッド オブジェクトを取得する例です。問題は、method-to-be- call を呼び出す方法です。
二次的な質問として、ドキュメントによると、識別関数は最初にクラスごとに計算してメソッドオブジェクトを見つけようとし、それが失敗した場合はcompute-applicable-methodsを使用します。なぜこの 2 層アプローチを採用するのでしょうか。find-methodがこの 2 層のアプローチを行っていると仮定するのは正しいので、 find- methodを使用する方がよいでしょうか?
-- 付録 -- 以下のコメントで、Rainer Joswig は、この検索メソッドの形式は実装に依存していると指摘しました。
彼は、指定子リストはクラスであるべきだと言い、代わりに次のように提案します:
だから私は自分のクラスをそこに置くことを考えました:
どうやら(defclass a ... )はaをクラスに設定していません。実際、それは何にも設定されていません!
... 変数 A はバインドされていません。
ただし、これは機能します。
したがって、クラスは、defclass に提供されるシンボルの値ではなく、defclass からの戻り値です。
oop - Common Lisp / CLOS でクラスメソッドを定義して呼び出す方法
インスタンスのメソッドが継承するのと同じ方法で、クラスの祖先に基づいて継承するクラス オブジェクトのメソッドを定義したいと思います。これを行う方法はありますか?
機能していないのは次のとおりです。 -eql
メソッドの特殊化。次の例を検討してください。
を呼び出すと が(wings-p (find-class 'woodpecker))
生成され、そのno-method-error
理由がわかります - classwoodpecker
は明らかeql
にどのメソッドの専門家にも当てはまりません。
bird
「メソッド」を onに定義して、 onanimal
を呼び出すとが返されるようにしたいと思います。wings-p
(find-class woodpecker)
wings-p
t
これはほぼすべての OO システムの標準機能のように感じますが、CLOS でそれを行う方法を思い出せません。