質問
している書Lispマクロうので別途の++のプログラミング言語のための意味。またこのために複数の異なる方法がないよう、すべてからのお客様に受け入れられてい通訳者はいないわからないしている場合は、正しい構文です。私の考えはどう定義することが
(defmacro ++ (variable)
(incf variable))
この与えられることになる簡易型-エラー時の活動に活用しようとしています。何ということなのです。
解決
覚えているマクロを返します表現を評価することができます。このため、backquote:
(defmacro ++ (variable)
`(incf ,variable))
他のヒント
両方の前の回答がないマクロを呼び出すとして
(++ varname)
の代わりにvarname++++またはpを疑います。わからない場合で、実際には前者が、後者で読むをクリックします。以来、二つの文字は、派遣をマクロであろう。潜在的に秘めないお手軽に走行lispもののようなもの:
(defun plusplus-reader (stream subchar arg)
(declare (ignore subchar arg))
(list 'incf (read stream t nil t)))
(set-dispatch-macro-character #\+ #\+ #'plusplus-reader)
う++var実際に 読む (incf var).
い暗号通信の使用を推奨しているエイリアスのためのincf.でいると読みやすさのために誰も読書コードしないという問題が英文の物理の問題です。どう違うのincf?"
したい場合は簡単なポインクリメントします:
(defmacro post-inc (number &optional (delta 1))
"Returns the current value of number, and afterwards increases it by delta (default 1)."
(let ((value (gensym)))
`(let ((,value ,number))
(incf ,number ,delta)
,value)))
の構文 (++ a)
は無駄なエイリアス (incf a)
.しかしい、意味論のインクリメント:取得の値とします。共通Lispを有することが期待されてい prog1
, ど: (prog1 i (incf i))
.Common Lispながら信頼性の低いまたは曖昧な評価した。前の表現の手段と i
が評価され、値がstashedどこかで、その (incf i)
を評価し、そのstashed値が返されます。
を完全に防弾 pincf
(ポストincf
が異なるようにします。 (incf i)
の素敵な物件 i
を評価します。このような (pincf i)
をもっている物件です。でのマクロは以下:
(defmacro pincf (place &optional (increment 1))
`(prog1 ,place (incf ,place ,increment))
いこいのリゾートにはLispの"配置場所分析装置"と呼ばれ get-setf-expansion
を得るため、当社のマクロをコンパイルにアクセスの適正:
(defmacro pincf (place-expression &optional (increment 1) &environment env)
(multiple-value-bind (temp-syms val-forms
store-vars store-form access-form)
(get-setf-expansion place-expression env)
(when (cdr store-vars)
(error "pincf: sorry, cannot increment multiple-value place. extend me!"))
`(multiple-value-bind (,@temp-syms) (values ,@val-forms)
(let ((,(car store-vars) ,access-form))
(prog1 ,(car store-vars)
(incf ,(car store-vars) ,increment)
,store-form)))))
数試験CLISP.(注:拡張に頼る材料から get-setf-expansion
を含む場合があり実装固有のコードです。これは当てはまりませんしたことを意味するものではあのマクロな可搬!)
8]> (macroexpand `(pincf simple))
(LET* ((#:VALUES-12672 (MULTIPLE-VALUE-LIST (VALUES))))
(LET ((#:NEW-12671 SIMPLE))
(PROG1 #:NEW-12671 (INCF #:NEW-12671 1) (SETQ SIMPLE #:NEW-12671)))) ;
T
[9]> (macroexpand `(pincf (fifth list)))
(LET*
((#:VALUES-12675 (MULTIPLE-VALUE-LIST (VALUES LIST)))
(#:G12673 (POP #:VALUES-12675)))
(LET ((#:G12674 (FIFTH #:G12673)))
(PROG1 #:G12674 (INCF #:G12674 1)
(SYSTEM::%RPLACA (CDDDDR #:G12673) #:G12674)))) ;
T
[10]> (macroexpand `(pincf (aref a 42)))
(LET*
((#:VALUES-12679 (MULTIPLE-VALUE-LIST (VALUES A 42)))
(#:G12676 (POP #:VALUES-12679)) (#:G12677 (POP #:VALUES-12679)))
(LET ((#:G12678 (AREF #:G12676 #:G12677)))
(PROG1 #:G12678 (INCF #:G12678 1)
(SYSTEM::STORE #:G12676 #:G12677 #:G12678)))) ;
T
今ここにあるキーの試験。ここで、場所を含むインターネットサイト: (aref a (incf i))
.こ評価しなければならなそう!
[11]> (macroexpand `(pincf (aref a (incf i))))
(LET*
((#:VALUES-12683 (MULTIPLE-VALUE-LIST (VALUES A (INCF I))))
(#:G12680 (POP #:VALUES-12683)) (#:G12681 (POP #:VALUES-12683)))
(LET ((#:G12682 (AREF #:G12680 #:G12681)))
(PROG1 #:G12682 (INCF #:G12682 1)
(SYSTEM::STORE #:G12680 #:G12681 #:G12682)))) ;
T
そうすること A
や (INCF I)
評価の一時的な変数 #:G12680
や #:G12681
.の配列がアクセスの数値で撮影され #:G12682
.そして当社 PROG1
を保持するた値を返します。の価値が増加され、保存の配列の位置によCLISPの system::store
機能です。この店舗電話用の一時的な変数ではなく、独自の表現 A
や I
. (INCF I)
のみ表示されます。
意味的には、prefixオ++および--言語のようにc++などと同等のincf/decfるcommon lisp.気づけばこのように、お間違った)では、マクロを実際に見の統語変化しまってかでbackticksのように`(incf,x).ちゃんとしてどのようにリーダー hackところも近く非lisp構文です。それが摩擦しているもののこれらのものは良い方法がありました。一般的に、不慣用的符号化への言語に似たもとでいきな良い方法がありました。
ただし、実際に意味が含まれた接頭辞のバージョンとして注目がpostfixのバージョンに行き渡らない合わせやす構文上.なにができるので十分なリーダー hackeryものなんですよ。
このうまっこ)っincf/decf名から慣用的に働くよびb)の書きポストincf、decfバージョン。g(defmacro後のincf(x)`(prog1x(incf,x))ダやココロはいろいろなこと.
個人的に思うのはどのように特に有用であろうがymmv.
事前にインクリメントが既にincfが定義することができごと
(define-modify-macro my-incf () 1+)
後のインクリメント、これらの料金-utils):
(defmacro define-values-post-modify-macro (name val-vars lambda-list function)
"Multiple-values variant on define-modify macro, to yield pre-modification values"
(let ((env (gensym "ENV")))
`(defmacro ,name (,@val-vars ,@lambda-list &environment ,env)
(multiple-value-bind (vars vals store-vars writer-form reader-form)
(get-setf-expansion `(values ,,@val-vars) ,env)
(let ((val-temps (mapcar #'(lambda (temp) (gensym (symbol-name temp)))
',val-vars)))
`(let* (,@(mapcar #'list vars vals)
,@store-vars)
(multiple-value-bind ,val-temps ,reader-form
(multiple-value-setq ,store-vars
(,',function ,@val-temps ,,@lambda-list))
,writer-form
(values ,@val-temps))))))))
(defmacro define-post-modify-macro (name lambda-list function)
"Variant on define-modify-macro, to yield pre-modification values"
`(define-values-post-modify-macro ,name (,(gensym)) ,lambda-list ,function))
(define-post-modify-macro post-incf () 1+)
Altough思うのは、ヘッドアップする サイモン コメントのか、って思っていること user10029's"アプローチはまだ試してみる価値なので、楽しいかを組み合わせようとしたので受付回答を ++x オペレーターの仕事は増加価値のx1)です。ぜひ試してみてください!
説明:古き良きSBCLなコンパイルの彼の版では'+'記号を必ず明示的に設定の派遣-charルックアップテーブル make-dispatch-macro-character
, のマクロは必要以上の名前の変数を評価する前にします。こえてください:
(defmacro increment (variable)
"The accepted answer"
`(incf ,variable))
(make-dispatch-macro-character #\+) ; make the dispatcher grab '+'
(defun |inc-reader| (stream subchar arg)
"sets ++<NUM> as an alias for (incf <NUM>).
Example: (setf x 1233.56) =>1233.56
++x => 1234.56
x => 1234.56"
(declare (ignore subchar arg))
(list 'increment (read stream t nil t)))
(set-dispatch-macro-character #\+ #\+ #'|inc-reader|)
見 |inc-reader|
's docstring のための使用例です。(近)に関連する文書で、できるだけ早く送ってくださ
- http://clhs.lisp.se/Body/f_set__1.htm
- http://clhs.lisp.se/Body/f_mk_dis.htm#make-dispatch-macro-character
この実装は、どの結果がエントリ数のように+123以理解したうえで、これに従うこのデバッガにジャンプ no dispatch function defined for #\Newline
が一層の回避策(または回避)妥当と思われる:だいたいこだわり、おそらく最高の選択はできませんか++としての接頭辞が##その他のよりDSLっぽ液
感謝!
アンドレス
こんししたらいいと思います。lispグルなのです。
(defmacro ++ (variable)
`(setq ,variable (+ ,variable 1)))