リストにcharを挿入したい。ただし、この文字をリストの最後のシンボルとマージしたいと考えています。append と cons を使用すると、結果は常に 2 つの異なるシンボルになります。さて、私は 1 つのマージされたシンボルを私の結果にしたいと考えています。
例:
(XXXX 'a '5) ====> (a5)
代わりに、次のものが必要です。
(XXXX 'a '5) ====> (a 5)
リストにcharを挿入したい。ただし、この文字をリストの最後のシンボルとマージしたいと考えています。append と cons を使用すると、結果は常に 2 つの異なるシンボルになります。さて、私は 1 つのマージされたシンボルを私の結果にしたいと考えています。
例:
(XXXX 'a '5) ====> (a5)
代わりに、次のものが必要です。
(XXXX 'a '5) ====> (a 5)
Lisp では「シンボルをマージ」することはできません。
まず5、記号ではなく数字です。名前付きのシンボルが必要な場合は、次の"5"ように入力する必要があります|5|(たとえば)。
関数がシンボルAとシンボルを受け取り、シンボル|5|を生成する場合、シンボルA5はマージされていません。これらの入力シンボルの名前を連結した名前の新しいシンボルが作成されました。
適切に設計された Lisp プログラムは、シンボルの命名方法にほとんど依存しません。それらは、シンボルが一意のエンティティであることに依存しています。
シンボルを使用して物事を識別し、エンティティ5をA識別する場合、少なくとも名前上はこれら 2 つのシンボルのマッシュアップである新しいシンボルを作成することが必ずしも最善の答えではありません。たとえば、より良い設計は、名前が多面的または何らかの形で複合的であることを受け入れることかもしれません. おそらく、リスト(A 5)は名前として機能する可能性があります。
Common Lisp 関数自体は複合名を持つことができます。たとえば(setf foo)、関数名です。リストのような集合体は名前にすることができます。
マシンが実行時に一意のシンボルを生成するだけでよい場合は、gensym関数の使用を検討してください。独自のプレフィックスを渡すことができます。
(gensym "FOO") -> #:FOO0042
もちろん、プレフィックスは既存のシンボルの名前にすることができ、 によって引き出されsymbol-nameます。シンボル#:FOO0042は一意ではありません0042が、アドレス空間で新しく割り当てられたオブジェクトであるためです。これ#:は、どのパッケージにもインターンされていないことを意味します。シンボルの名前はFOO0042.
それでも本当にやりたい場合は、一連の入力オブジェクトの印刷された表現を取得してシンボルに変換する簡単な方法は次のとおりです。
(defun mashup-symbol (&rest objects)
(intern (format nil "~{~a~}" objects)))
例:
(mashup-symbol 1 2 3) -> |123|
(mashup-symbol '(a b) 'c 3) -> |(A B)C3|
これを定義します。
(defun symbol-append (&rest symbols)
(intern (apply #'concatenate 'string
(mapcar #'symbol-name symbols))))
そしてそれを次のように使用します:
* (symbol-append 'a 'b 'c)
ABC
* (apply #'symbol-append '(a b c))
ABC
引数に記号以外のものが含まれていると予想される場合は、次のものに置き換えsymbol-nameます。
(lambda (x)
(typecase x ...))
または、何かを文字列化する既存の CL 関数 (私は :() を忘れてしまいました。
あなたが尋ねる質問への答えは
(defun concatenate-objects-to-symbol (&rest objects)
(intern (apply #'concatenate 'string (mapcar #'princ-to-string objects))))
(concatenate-objects 'a 'b) ==> ab
ああ、結果としてリストが必要な場合:
(defun xxxx (s1 s2) (list (concatenate-objects-to-symbol s1 s2)))
ただし、これはあなたが実際に尋ねたい質問ではないと確信しています。
プログラムで新しいシンボルを作成することは、初心者がすべきことではありません...