2017-10-12 9 views
-1

に新しいシンボルを導入、私はこのような関数/マクロを持つ例えば、LISPすることが知られていないいくつかの単語/記号を使用してCommon Lispの中の機能を定義します:共通-Lisp関数/マクロ

(my-func-or-macro lst key-word idx) 

key-wordがからある場合key-wordおよびidxから端まである場合idx件までlst内の項目を返します。

だから、事実上、それは次のように動作するはずです:マクロは引数を評価しませんので

(my-func-or-macro '(1 2 3 4 5 6) from 3) => '(4 5 6) 

(my-func-or-macro '(1 2 3 4 5 6) to 3) => '(1 2 3) 

私はおよそfromを気にしないマクロを使用する必要があると思いますto(私は'from'toのような引用符付きの引数を渡したくないことに注意してください)。

+3

通常、次のようなキーワード引数を持つ関数を使用します。 nd:to。 –

+0

実際の質問を追加することを忘れないでください。「したい...」は質問ではありません。 –

+0

あなたは正確に何について疑問に思っていますか?異なるパッケージのシンボルを比較するには? – Sylwester

答えて

2

関数のすべての引数は、関数が実行される前に評価されるため、評価するシンボルが必要です。

このようなシンボルは既に言語の一部です。特別なKEYWORDパッケージのすべてのシンボルは、自分自身に評価されます。先行するコロンで書かれた記号、例えば、 g。 :fooはそのパッケージに収容されています。

また、言語の一部は、パラメータを特定するために、このようなキーワードを使うキーワード引数です:

(defun my-func (list &key from) 
    (subseq list from)) 

(my-func '(0 1 2 3 4 5) :from 3) 
=> (3 4 5) 

あなたは、このようなパラメータにデフォルト値を与えることができます:

(defun my-func (list &key (from 0) (to (length list))) 
    (subseq list from to)) 

(my-func '(0 1 2 3 4 5) :from 3) 
=> (3 4 5) 

(my-func '(0 1 2 3 4 5) :to 3) 
=> (0 1 2) 

(my-func '(0 1 2 3 4 5) :from 1 :to 4) 
=> (1 2 3) 

キーワード引数はいずれにも与えることができorder:

(my-func '(0 1 2 3 4 5) :to 4 :from 1) 
=> (1 2 3) 
関連する問題