- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在随意探索 PicoLisp,发现自己对如何编写传统上用宏(在其他 lisp 方言中)处理的元编程函数感到困惑。我最担心的是我不知道如何防止变量名隐藏。查看 Metaprogramming 101 中的示例有,如果有的话,只是让我更加困惑。
有关如何实现函数 mapeach
的示例,如链接文章中所示:
[de mapeach "Args" # expression
(let [(@Var @List . @Body) "Args"]
(macro
(mapcar
'((@Var) . @Body)
@List ]
(de mapeach "Args"
(mapcar
(cons (cons (car "Args")) (cddr "Args"))
(eval (cadr "Args")) ) )
(de mapeach "Args"
(mapcar
'(("E")
(bind (car "Args")
(set (car "Args") "E")
(run (cddr "Args")) ) )
(eval (cadr "Args")) ) )
(de mapeach "Args"
(let "Vars" (pop '"Args")
(apply mapcar
(mapcar eval (cut (length "Vars") '"Args"))
(cons "Vars" "Args") ) ) )
我已经通过调用 (let "Args"* (mapeach N (1 2 3) ("Args"N N)))
测试了其中的每一个。正如预期的那样,PicoLisp 解释器(使用命令 pil +
启动)遇到段错误并崩溃。我认为这是因为 mapeach
的 "Args"
隐藏了在调用点定义的 "Args"
。
我还尝试了他们对 map@
的两种实现(mapeach
的“更可爱”替代方案)。
(de map@ "Args"
(mapcar
'(("E") (and "E" (run (cdr "Args")))) # 'and' sets '@'
(eval (car "Args")) ) )
(de map@ "Args"
(mapcar
'((@) (run (cdr "Args")))
(eval (car "Args")) ) )
我使用 (let "Args"* (map@ (1 2 3) ("Args"@ @)))
来测试每个实现。奇怪的是,我第一次测试第一个实现时,它不仅没有段错误,而且实际上产生了正确的结果 (1 4 9)
。随后的每个测试都会导致段错误。为清楚起见,提示中的片段:
: (de map@ "Args"
(mapcar
'(("E") (and "E" (run (cdr "Args")))) # 'and' sets '@'
(eval (car "Args")) ) )
-> map@
: (let "Args" * (mapeach N (1 2 3) ("Args" N N)))
!? (mapeach N (1 2 3) ("Args" N N))
mapeach -- Undefined
?
: (let "Args" * (map@ (1 2 3) ("Args" @ @)))
-> (1 4 9)
我相信通过调用(当时的)未定义函数 mapeach
以某种方式阻止了段错误,我还尝试了 (ooga booga)
,这同样阻止了段错误.如果我没有将定义与正确调用分开的错误调用,则总会发生段错误。
这最终会导致 2 个问题:
最佳答案
According to this “临时符号的索引在加载源文件之前和之后自动清除,或者可以使用 ==== 函数显式重置”。它没有指定在常规 REPL 使用期间自动清除它的任何方式,这是我测试它的上下文。
这段代码运行正常:
[de mapeach "Args" # expression
(let [(@Var @List . @Body) "Args"]
(macro
(mapcar
'((@Var) . @Body)
@List ]
(====)
(let "Args" * (mapeach N (1 2 3) ("Args" N N)))
它也可以在不调用 ====
的情况下按预期运行,但前提是对 mapeach
的调用不在同一文件中。
解决我问题的两个部分:
====
后防止名称隐藏。关于scope - 如何编写不使用其参数隐藏变量的 PicoLisp 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55697674/
我正在随意探索 PicoLisp,发现自己对如何编写传统上用宏(在其他 lisp 方言中)处理的元编程函数感到困惑。我最担心的是我不知道如何防止变量名隐藏。查看 Metaprogramming 101
这个问题真的没有实际意义,我想我一定是在我的程序中遇到了错误或其他什么。如果您还在寻找 PicoLisp和 onOff 行为,看 here . 这是应该发生的吗? : (show NIL) NIL N
我是 Picolisp 的新手。 我试过了,得到了一个段错误: : ('(1 2) 6) Segmentation fault 但是,如果我尝试: : ('(a b c) 6) -> NIL 我基本上
我是一名优秀的程序员,十分优秀!