普通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上)。而且,@只有一个字符长。
- 用作
progn,带有可变数量的参数,但打印到标准输出。在实际的应用程序中,我可能会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