Emacs Lisp で反復タスクを実行するマクロの小さなシステムを作成しようとしています。while
ループの先には何もないことを当然のことと思っていました。プリミティブや隠された機能はもうありませんが、私は尋ねたほうがよいと判断しました。
「隠れた機能」とはtagbody
、Common Lisp に似たもの、つまり、ブロック、ジャンプ、およびラベルに関してコードをモデル化するための非常に原始的な形式を意味します。eLispにそのようなものはありますか? たとえば、バイトコードを使用するなど、「ハック」の方法でさえありませんか? もちろん、私は(catch ... (throw ... ))
コンストラクトについて知っていますが、「後方へ」のジャンプのみを許可し、前方へのジャンプは許可しないため、まったく同じではありません。また、これはかなり複雑な構造であり、高速反復プリミティブの構築には適していないと想定しました。
私を悩ませているもう 1 つのことは、ハッシュ テーブルのイテレータを作成する方法がないように見えることです。つまり、ハッシュテーブルは を使用して反復する必要があり、関数maphash
を終了すると、終了maphash
した場所に戻ることはありません。これまでのところ、キーのベクトルと値のベクトルをエクスポートしてこれらを反復処理する必要があることを理解していますが、これらのベクトル/リスト/それらが何であれ、それらを取得する方法はないようです. それともまた間違っていますか?
cl
package がloop
and dotimes
/ dolist
/のコードを生成する方法を調べましたが、 orの適切な方をdo
使用するだけで、率直に言って、私はそれらのコードがあまり好きではありません... 2 つの句があり、最初の句は無視され (警告も表示されません)、2 番目の句のコードが生成されます:|while
maphash
loop
for-as-hash
これらの反復プリミティブを eLisp のユーザー コードから取得するためのトリックがある可能性はありますか? そうでない場合、C で拡張機能を作成することはどの程度実現可能で、実際に可能でしょうか?