Common Lisp-119.7(133 -10%)
(defmacro @(&whole f &rest r)(let((g(gensym)))`(let((,g(multiple-value-list,@r)))(progn(format t"~s~{ ~a~}
"',f,g)(values-list,g)))))
- 名前付き
@ので、log標準の対数関数であり、(少なくともSBCLの)デフォルトでロック。また、@1文字のみです。
progn可変数の引数をとるa として機能しますが、標準出力に出力します。実際のアプリケーションでは、signalスペースで区切られた出力を印刷する代わりに、おそらくS式を使用した条件になります。
- 既存のClojureソリューションとは異なり、ログに記録された式の値を最終的に返すので、
(@ x)いつでも使用できますx。
- 印刷では
prin1、read-able文字列を出力します。これは、ログに記録された式を再現するときに役立ちます。
- 可能なすべてのタイプを処理します(Cの回答を参照)
- 複数の値を考慮に入れる
- 異なる出力を生成しません(Scalaの回答を参照)
- ファイルおよびREPLから機能します(Pyhtonの回答を参照)
- ブラウザー/インタープリタートリックを必要としません(Pythonトレースバック、Javascriptリクエスト)
サンプル出力:
CL-USER>(@ (+ 3 2)) ; user input
(@ (+ 3 2)) 5 ; printed output
5 ; result of expression
CL-USER> (@ (values 3 4)) ; input
(@ (VALUES 3 4)) 3 4 ; logging
3 ; first value
4 ; second value
CL-USER>(@ (round 3.4))
(@ (ROUND 3.4)) 3 0.4000001
3 ; rounded value
0.4000001 ; delta
そして最後に、上記をログに記録するとdefmacro、私は未ゴルフバージョンを持っています:
CL-USER> (@ (defmacro @(&whole f &rest r)(let((g(gensym)))`(let((,g(multiple-value-list,@r)))(progn(format t"~s~{ ~a~}
"',f,g)(values-list,g))))))
STYLE-WARNING: redefining COMMON-LISP-USER::@ in DEFMACRO
(@
(DEFMACRO @ (&WHOLE F &REST R)
(LET ((G (GENSYM)))
`(LET ((,G (MULTIPLE-VALUE-LIST ,@R)))
(PROGN
(FORMAT T ,"~s~{ ~a~}
"
',F ,G)
(VALUES-LIST ,G)))))) @
@ ; actual result