写lisp时总是反感用let*,怎么办?

有没有人和我一样,写lisp时总是反感用let*,宁愿用多层let也不想用let*。

求病友,求治疗方案 :sweat_smile:

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)) 

喜欢哪个用哪个,无所谓的

5 个赞

这个seq用得妙。学习了 :grin:

let* 是最佳实践,最少代码量连续写变量赋值的方法

6 个赞
(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*,咋还反感呢?:slight_smile:

1 个赞

也不总是反感。严谨一些,反感在没有严格的链式依赖的情况下使用let*

Lisp 应当取消 let, 全部改用 let*

实际编程中必须用 let 不可的情况只占1%, 而且大不了重新取一个名字 OK, let* 可以覆盖 99.9% 的情况.

可惜 letlet* 沿用太久, 现在大家都习惯了更没人改了

1 个赞
(let ((x y) (y x)) ...)

可能是最常见的不能用 let* 的情況

现在一般会用 tuple 来 pattern match 实现这个功能罢了

let (x, y) = (y, x) in ...
5 个赞