有没有人和我一样,写lisp时总是反感用let*,宁愿用多层let也不想用let*。
求病友,求治疗方案
有没有人和我一样,写lisp时总是反感用let*,宁愿用多层let也不想用let*。
求病友,求治疗方案
setq 解千愁(误
(let ((a 1))
(let ((b (+ 1 a)))
(let ((c (+ a b)))
(+ a b c))))
(let* ((a 1)
(b (+ 1 a))
(c (+ a b)))
(+ a b c))
(let (a b c)
(setq a 1)
(setq b (+ 1 a))
(setq c (+ a b))
(+ a b c))
喜欢哪个用哪个,无所谓的
这个seq用得妙。学习了
let* 是最佳实践,最少代码量连续写变量赋值的方法
(let* ((a foo)
(b (bar0 a))
(c (bar1 a)))
...)
与
(let ((a foo))
(let ((b (bar0 a))
(c (bar1 a)))
...))
相比呢?运行时间和占用的资源会有差别吗?
就是个变量,不会有资源消耗差别。
反而第二种还多写了一层括号,代码更冗余了。
(let* ((...)
(...)
...)
...)
是不是等价于多个(let ((...)) ...)
的嵌套?
肯定呀, 你就三个变量, 你嵌套三个 let 或者写三个 setq 不累吗?
嗯嗯。对于严格的a->b->c->d->e->f->g这样的依赖关系,肯定是let*兼顾美观和效率。但是对于a->b, a->c, a->d, b->e, c->f, ->g的情况,可能就得在美观和效率上做个取舍了
啊?我就好喜欢这个let*
,咋还反感呢?
也不总是反感。严谨一些,反感在没有严格的链式依赖的情况下使用let*
Lisp 应当取消 let
, 全部改用 let*
实际编程中必须用 let
不可的情况只占1%, 而且大不了重新取一个名字 OK, let*
可以覆盖 99.9% 的情况.
可惜 let
和 let*
沿用太久, 现在大家都习惯了更没人改了
(let ((x y) (y x)) ...)
可能是最常见的不能用 let*
的情況
现在一般会用 tuple 来 pattern match 实现这个功能罢了
let (x, y) = (y, x) in ...