问题标签 [let-over-lambda]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macros - 编写宏的宏 - 编译错误
当我编译以下代码时,SBCL 抱怨 g!-unit-value 和 g!-unit 未定义。我不确定如何调试它。据我所知,flatten 失败了。
当 flatten 到达 defunits 的未引用部分时,似乎整个部分都被视为一个原子。这听起来正确吗?
下面使用Let over Lambda一书中的代码:
保罗格雷厄姆公用事业
放弃 Lambda 实用程序 - 第 3 章
放弃 Lambda - 第 5 章
common-lisp - common lisp:如何运行 let-over-lambda 测试
我正在使用 Doug Hoyte 和 The Phoeron 的 let-over-lambda 的示例来同时建立我对 common-lisp 包、quicklisp 和 asdf 以及在 common lisp 中进行大规模编程的生产级专业实践的理解。
我能够以如下所示的方式使用该包,但还没有弄清楚如何使用类似的部分引导猜测来运行它的测试。详情如下。
我在这里找到了代码:https ://github.com/thephoeron/let-over-lambda 。我正在使用“消防软管”和“渐进式教育猜测”的方法尽可能快地将其塞进我的脑海中,并以此为指导。当然,与更结构化的方法相比,这种方法会给我留下更多模糊的知识点,但它可能会让我更快地到达山顶(请随意驳斥我的这个想法)。
以我目前的初步了解,我可以在自己的代码中使用该包。例如,我可以写
(load "~/quickload/setup.lisp")
(ql:quickload "let-over-lambda")
(let-overlambda:flatten '((a . b) c (d e)))
并得到
lol
通过阅读“package.lisp”中的内容,我可以注意到该包定义了一个昵称defpackage
,即(缩写):
(defpackage #:let-over-lambda
(:nicknames #:lol)
(:use #:cl #:cl-user #:cl-ppcre)
我可以使用昵称:
甚至导入它的导出,摆脱任何限定符号的需要:
现在,我注意到 repo 包含一个诱人的测试包和目录“t”:
-rw-r--r-- 1 921 Dec 5 05:27 let-over-lambda-test.asd
-rw-r--r-- 1 941 Dec 5 05:27 let-over-lambda.asd
-rw-r--r-- 1 17421 Dec 5 05:27 let-over-lambda.lisp
-rw-r--r-- 1 1771 Dec 5 05:27 package.lisp
drwxr-xr-x 3 102 Dec 5 05:27 t
不过,我无法弄清楚如何运行测试,这是我的问题:我该怎么做?以下是我在 sbcl 1.3.1 中尝试过的一些事情,但未成功:
和这个
编辑:快速加载“证明”,如下所示,将一堆更酷的东西加载到我的环境中,但仍然让我不知道如何运行测试。我原以为“证明”会自动快速加载为defsystem
“let-over-lambda-test”中的依赖项,所以这是一个小惊喜:
我将不胜感激任何指导。
lambda - 计划中的让过 lambda?
在 Common Lisp 中,如果我想要两个函数共享状态,我会执行一个let over lambda,如下所示:
这些函数不是本地的let
- 它们是维护对共享状态变量的引用的全局函数,该变量本身从外部是不可见的。例如,我可以在代码的其他地方执行以下操作:
然而,在 Scheme 中,这样的构造声明了局部函数,这些函数从外部是不可见的:
我能想到实现这种功能的唯一方法(除了在模块中使用未导出的全局变量)是这样的:
在 Scheme 中有没有一种方法可以编写let-over-lambda形式而无需求助于这种丑陋的变通方法?还是我需要编写一个宏来包装这种丑陋?(顺便说一句,我知道letrec
,这不是解决这个问题的方法。)
顺便说一句,我使用的是 Chicken Scheme,但我的问题应该与所有 Schemes 有关。
closures - 如何编译出 Pandoric 宏中的符号?
我已经阅读了LOL的第 6.7 节几次,但我仍然无法理解以下内容。
以前对外部代码关闭的绑定现在对我们开放供我们修改,即使这些绑定被编译为有效的东西并且早已忘记了它们的访问器符号。
如果绑定符号本质上被编译为闭包环境中的指针,那么如何将符号传递给已经编译的函数,并且函数能够以某种方式比较符号?
我一直在搞乱pantest
clisp 中的示例,我可以看到我能够同时更改acc
和this
inside pantest
。我可以编译和反汇编pantest
,但所有符号都显示在环境中。如果我有一个可以编译成汇编的 lisp,我可能会获得更多的直觉,但代码足够复杂,如果没有解释可能很难理解。
macros - Let over Lambda 一书中的 sortf 中的“a1”绑定在哪里?
Doug Hoyte 的“Let over Lambda”一书描述了一种通过排序网络对固定大小的输入进行快速排序的函数:
表达式“(car a1)”和“(cadr a1)”中的符号“a1”从何而来?
顺便提一句。“定义宏!” 是一个定义宏的宏,它引入了 'g!{symbol}' 语法以通过 'gensym' 创建一个新的符号。'build-batcher-sn'使用Batcher 算法构建排序网络。