問題タブ [practical-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 - Lisp での破壊的ソート
Practical Common Lispを読んでいます。第11章では、ソートについて次のように述べています。
通常、シーケンスをソートした後は、シーケンスのソートされていないバージョンを気にすることはないため、ソートの過程でシーケンスを許可
SORT
しSTABLE-SORT
て破棄することは理にかなっています。ただし、次のように書くことを忘れないでください。
次のコードを試しました:
*a*
このコードでは、関数によって変数が変更されていることがわかりsort
ます。
では、なぜ本はそれが課題を行うために必要であると言っているのですか?
私はSBCL + Ubuntu 14.04 + Emacs + Slimeを使用しています
編集:
@Sylwester のコメントに続いて*a*
、値が変更されたことを明確にするための評価を追加します。
macros - defmacro 仮引数リストの `(&rest xs)` と `xs` の違い
Practical Common Lisp のChapter 8 , Macros: Defining Your Own では、次のようにマクロを定義with-gensyms
します。
の目的は何(&rest names)
ですか? だけに置き換えてもnames
、効果は同じようです。どちらの場合も、「gensym-ed」にするシンボルのリストを渡します。
lisp - Common Lisp で「multiprocessing」という名前のパッケージを見つける
私は SBCL (SBCL 1.2.13.84-7d75f89) で作業しており、この本から Common Lisp を学んでいます。という名前のパッケージを見つけてロードしようとして、問題が発生しましたmultiprocessing
。
私はそれを使用するquicklispパッケージがあるかどうかを確認しようとしまし(ql:system-apropos "multiprocessing")
た(ql:system-apropos "thread")
。(ql:system-apropos "smp")
Google やQuickdocsでも検索しましたが、どこかで失敗しているようです。
どんな援助にも感謝します。
lambda - 実用的な Common LISP の理解 第 3 章
Practical Common Lispの第 3 章を見ています。その章では、アプリケーションのようなデータベースを作成します。私はupdate
機能を理解するのに行き詰まっています。
エディターでコードを記述し、コードを自分で理解できるようにコメントを入れました。
以前はwhere
関数が与えられていました:
ご覧のとおり、この本で紹介されているコードにはいくつかの質問があります。以下にそれらをもう一度リストしますが、それらが何に関連しているかがより明確になるように、コメントを残しておいてください.
- 一見すると、これはコードの重複のように見えます。
where
これらすべてのif
式をもう一度書く代わりに、どうにかして関数を使用できないのはなぜですか? - (その
funcall
コードのその章の本では説明されていません...)実際に、指定された関数への呼び出しの戻り値であるセレクター関数を呼び出す場合、where
なぜそれらすべてのif
式をそこに書かなければならないのですか? それはまさにwhere
関数が返すものではありませんか? 基準に適合する行のセレクターは? - 表現に属しているように見える表現の
row
後にあるのはなぜですか? 更新された行を返すように、式は何も返さないため、それは戻り値ですか?when
lambda
when
lambda
このコードの非常に高度な構文が適切に説明されていないように感じ、そのコードがどのように機能するかを推測しています。
コードの呼び出し例は次のとおりです。
私はそれを試しました、そしてそれは本当にうまくいきました。
ここに私の「データベース」があります:
これまでの完全なコードは次のとおりです。
macros - 「1 回限り」マクロの使用
Practical Common Lispの Ch 8 の最後で、Peter Seibel がonce-only
マクロを提示します。その目的は、ユーザー定義マクロでの変数評価に関する多くの微妙な問題を軽減することです。この時点で、他の投稿のようにこのマクロがどのように機能するかを理解しようとしているのではなく、適切に使用する方法だけを理解しようとしていることに注意してください。
以下は、いくつかの変数評価の問題を提示しようとする (正しくない) 不自然なマクロのサンプルです。整数の範囲をデルタで反復処理し、範囲を返すことを目的としています。
たとえば、(do-range (i 1 15 3) (format t "~A " i))
印刷1 4 7 10 13
してから返す必要があります14
。
問題には、1) の 2 番目のオカレンスがlimit
自由変数として発生するため、潜在的にキャプチャされる、2) バインドされた変数 の最初のオカレンスがキャプチャされる可能性があるlimit
、マクロ パラメーターに現れる他の変数と一緒に式で発生するため、 3) 順不同の評価。パラメーター リストの前に表示されますが、のdelta
前に評価されます。4)とが複数回評価されるため、複数の変数評価。私が理解しているように、これらの問題を修正する必要があります。stop
stop
delta
stop
start
once-only
ただし、バインドされていない変数であることに(macroexpand '(do-range (i 1 15 3) (format t "~A " i)))
不満があります。limit
代わりに に切り替えるとwith-gensyms
、上記の問題 1 と 2 のみを処理する必要があり、展開は問題なく進行します。
これはonce-only
マクロの問題ですか?そしてonce-only
、上で概説したすべての問題 (およびおそらく他の問題) を本当に解決しますか?
common-lisp - 2 つのリストをパラメーターとして受け取る LISP 関数
過去のクラスで LISP について簡単に話した後、私はまず頭に飛び込んでCLISPを学ぼうと決心しました( Seibel の PCL の第 5 章を読んでください)。私の質問は、一連のリストをパラメーターとして受け取る関数の作成に関するものです。最初のリストは、2 番目のリストにマップされた一連のインデックスです。一連のインデックスを渡し、対応する要素を返すようにしたいと考えています。
これまでの私のコードの概要は次のとおりです。nth を使用して引数のリストを渡すことができるかどうかはわかりませんでした。体型がどのように見えるべきかわかりません。
システム情報: CLISP 2.49 Win7
リスト(x y z)
はインデックスであり、データ リスト(a b c)
は任意の要素のリストです。評価はデータとして関数 get-elements に渡されます。私はこの考え方で正しい軌道に乗っていますか?
LISP 教育の関連トピックへのヒントとポインタは大歓迎です。
事後分析: チャプター 3 ~ 4 を再検討すると、PCL は初心者のプログラマー (少なくとも私にとって) には少し手の届く範囲にあるように見えます。本からコードを入力することはできますが、明らかに言語の基本構造を深く理解していません。再び PCL に着手する前に、Lisp についてもう少し穏やかに紹介してみようと思います。