// ============================================================ // Monkey 案例 3:宏 // // 下面的命令假设当前在仓库根目录。已经 cd 到 posts/monkey 时, // 把路径里的 posts/monkey/ 去掉即可。 // // 宏在求值前展开:macro 接收的是代码,quote 把代码包起来, // unquote 把参数插进去。 // // 运行: // monkey posts/monkey/case_macro.txt // // 这个解释器已经预置了 unless;这里重新定义一次,方便看到它的写法。 // 再定义一个 when,展示宏可以生成不同的控制流。 // // 在网页终端或 SSH 里输入上面的命令;输出可以接管道: // monkey posts/monkey/case_macro.txt | cat // 从本地走 SSH 一次性命令(<站点> 换成首页横幅里的地址): // ssh -p 443 <站点> 'monkey posts/monkey/case_macro.txt' // ============================================================ let unless = macro(cond, cons, alt) { quote(if (!(unquote(cond))) { unquote(cons); } else { unquote(alt); }); }; let when = macro(cond, body) { quote(if (unquote(cond)) { unquote(body) }); }; // 条件为假,走 cons 分支 unless(1 > 2, puts("unless: condition false"), puts("unless: condition true")); // 条件为真,执行 body when(1 < 2, puts("when: condition true")); // 最后给出一个值,避免结尾多一个 null "done"