(rontolisp) docs
← 構文と定義

with-meta

(with-meta obj metadata)

マップ metadata(なしなら nil)を持つ obj のコピーを返します。meta で 読み戻せます。元の値は自分のメタデータを保ち、= はメタデータを無視します。メタデータを 持てるのはマップ、ベクター、リスト、セット、レコード、reify 値、遅延シーケンス、関数です。 文字列、数値、キーワードなどはオラクル同様シグナルを上げます。シンボルはメタデータを持たず、 そのまま返ります。

メタデータがディスパッチを変えるのは :extend-via-metadata true と宣言したプロトコルだけです (defprotocol 参照)。コピーから導いた値(assoc、conj など)は メタデータなしで始まります(オラクルは引き継ぎます)。

名前やローカルについたリーダーメタデータ(^:private、^:dynamic、^{...} attr マップ、 型ヒント)は解析して捨てられ、^:dynamic を読むのは binding だけです。ベクター・マップ・ セットのリテラルについたものはオラクルのリーダー同様に付きます。^:k [1] は {:k true} を 持ちます。

*print-meta* が真の間、pr、prn、pr-str、str は空でないメタデータを値の前に 書きます(^{:k 1} [1 2]、:tag だけなら ^String [1])。print と println は 書きません。

^{:k 1} [1 2]