0

任意の数のシンボルを取り、それらをすべて nil に設定する nil 関数を作成したいと思います。

(defun clean (as many args as given by user)
  (setq each-arg nil)
)

(clean x y z)

これを「きれいに」行う方法は?

4

2 に答える 2

5

引数を引用していないので、マクロである必要があります。

(defmacro clean (&rest symbols)
  `(progn
     ,@(mapcar (lambda (sym) (list 'setq sym 'nil))
               symbols)))
于 2013-01-12T10:35:31.473 に答える
5

Dmitry と同様の考え方ですが、生成されるコードはわずかに少なくなります。

(defmacro clean (&rest variables)
  `(setq ,@(loop for var in variables nconc (list var nil))))

(macroexpand '(clean a b c d))
;; (setq a nil b nil c nil d nil)

あなたの他の質問について:

  • 簡単ですが、時間のかかる方法は、知らない関数にポイントを移動することです。そうしないとC-h fM-xdescribe-function関数名がプロンプトに表示され(実際に Emacs Lisp 関数である場合)、説明が表示されます。利用可能なソース コード内の場所。

  • 私は説明しようとしますが、私は言語リファレンスではありません:)

    • defmacro- 関数に似ていますが、引数を評価しません。マクロは、コードが読み取られてバイトコードにコンパイルされるときに実行されます。彼らの主な目的は、他のコードを生成することです。
    • lambda- は無名関数を作成して返すマクロです。
    • mapcar- リストのすべての要素に連続して関数を適用し、関数を適用した順序で結果をリストに収集する高次関数です。
    • &rest- は、関数のラムダ リスト (つまり、パラメーターの定義) 内の特別なキーワードであり、文字通り、このシンボルに続く識別子がその右側にあるすべての引数のリストであることを意味します)。
    • ,@バッククォート マクロ内のマクロで使用される特別な演算子です。これは、それに続く式を評価し、リストとして扱い、そのすべてのコンスを現在解析中のフォームに追加する必要があることをリーダーに指示します。
于 2013-01-12T12:38:56.073 に答える