在我不断学习 lisp 的过程中,我遇到了一个概念问题。这有点类似于这里的问题,但也许在主题上适合说我的问题是一个抽象级别。
通常,什么时候应该创建宏而不是函数?在我看来,也许天真地,很少有情况需要创建宏而不是函数,并且在大多数剩余情况下,函数通常就足够了。在这些其余情况中,宏的主要附加价值似乎是语法的清晰度。如果是这样的话,那么对于个体程序员来说,似乎不仅是选择使用宏的决定,而且其结构的设计也可能从根本上是特殊的。
这是错误的吗?是否有一般情况概述何时使用宏而不是函数?我说的对吗,语言需要宏的情况通常很少?最后,是否存在宏所期望的通用语法形式,或者它们通常被程序员用作简写?
这可能是一个愚蠢的问题,但我正在浏览 PG lisp 书,我想逐步了解他提供的一些带有实际值的示例宏,例如:
(defmacro our-let (binds &body body)
`(
(lambda ,(
mapcar #'(lambda (x) (if (consp x) (car x) x)) binds
)
,@body
)
,@(mapcar #'(lambda (x) (if (consp x) (cadr x) nil)) binds)
)
)
Run Code Online (Sandbox Code Playgroud)
我天真地尝试运行(trace our-let),然后(our-let ((x 1) (y 2)) (+ x y))我收到一个错误,can't use encapsulation to trace anonymous function #<FUNCTION (MACRO-FUNCTION OUR-LET) {22675BBB}>. 也不确定如何最好地将print语句放入 lambda 表达式中。调试此宏/输出如何处理输入的最佳方法是什么?
编辑(1):我的 格式不正确macroexpand,但有效。
我对这个问题有一个不同的版本:
我正在构建一个同时使用 Electron 和 Redux 的create-react-app 模板。
我想/src/config在安装后将 webpack 和 babel 的配置文件从目录移动到根目录。但是,添加"postinstall": "cp /src/config ."到我的package.json文件不起作用。看起来该文件并不是template.json添加安装后脚本的正确位置,但由于某种原因,可能是由于模板系统管理内部文件结构的方式(?)该脚本在安装后运行但失败。我的配置文件位于/template/src/config我发布的包中。
编辑:如果我将安装后脚本更改为,它看起来会运行,"cp template/src/config/* ."但它不会复制任何文件。
Julia 新手,浏览手册并在方法下找到此示例:
julia> mytypeof(x::T) where {T} = T
mytypeof (generic function with 1 method)
Run Code Online (Sandbox Code Playgroud)
当您使用 的值调用此方法时x,它会返回类型:
julia> mytypeof(1)
Int64
julia> mytypeof(1.0)
Float64
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么这会返回一个值?换句话说,隐含的返回值在哪里?
我基本上没有关于Lisp的经验,所以对js来说微不足道的工作对我来说是陌生的。
例如,我正在研究一种_.chunk方法的实现,该方法在js中采用一个数组和一个size变量,并按大小“分块”该数组:
_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]
_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]
Run Code Online (Sandbox Code Playgroud)
作为对通用Lisp数据类型完全陌生的人,我认为类似类型将是向量,而不是数组,对吗?
其次,我在算法上解决此问题的方法是保留一个length变量和一个pointer变量,并获取数组/向量的一个子集,[指针+大小的指针],而指针+大小为<长度,然后返回[指向长度的指针],当它不再为真时,否则增加指向指针+大小+ 1的指针。
不知道如何在Lisp中实现它,到目前为止,这是我的代码。
(defun _.chunk (vector &optional (size 1 size-p))
(if (or (not size-p) (eq size 1))
vector
((let (
(array_length (array-total-size array))
(pointer)
)
???
))
)
)
Run Code Online (Sandbox Code Playgroud) 作为自己学习普通口语的一项任务,我正在尝试重新创建lodash。
在重新创建的过程中_.chunk,我编写了以下代码来测试可选参数
(defun _.chunk (array &optional size)
(if (size)
(write ("there") )
(write ("not") )
)
)
Run Code Online (Sandbox Code Playgroud)
设置(setf x #('a 'b 'c 'd))然后运行(_.chunk x),出现错误:
; caught ERROR:
; illegal function call
; (SB-INT:NAMED-LAMBDA _.CHUNK
; (ARRAY &OPTIONAL SIZE)
; (BLOCK _.CHUNK
; (IF (SIZE)
; (WRITE ("there"))
; (WRITE ("not")))))
Run Code Online (Sandbox Code Playgroud)
测试可选功能参数的正确方法是什么?