5

incf を使用して値を追加するのと同様に、特定の係数を掛けてプロパティ リスト内のプロパティ値を変更する方法を探しています。

incf を使用すると、次のように言えます。

(let ((seq '(:x 10 :y 3)))
 (incf (getf seq :y) 3)
 seq)

-> (:x 10 :y 5)

マクロを使用すると、次の方法で結果を取得できますが、これは getf を 2 回使用します。

(defmacro multf (place val)
  `(setf ,place (* ,place ,val)))

(let ((seq '(:x 10 :y 3)))
  (multf (getf seq :y) 2)
  seq)

-> (:x 10 :y 6)

getf を 1 回だけ使用して同じ結果を得るには、どうすればよいでしょうか?

この機能を備えたパッケージがあるかもしれませんが、ネットで見つけることができませんでした。どんな助けでも大歓迎です!これは宿題ではありません。コードを最適化しようとしているだけで、言語をよりよく理解したいと思っています。setf-expanders と compiler-macros について読みましたが、それらがここに適用されるかどうか、およびそれらを使用する方法がわかりません。

4

1 に答える 1