等价于let *?

问题描述 投票:1回答:3

flet*中没有flet,因为我可以在emacs lisp中找到let*中有let –因此,这四个替代方案中的任何一个更惯用于定义一个函数多次使用的功能。 flet定义的单个功能?在此示例中,add1是我想在add1twice中重用但不在其外部使用的功能。

选项1

(defun add2 (x)
  (flet ((add1 (x) (1+ x)))
    (flet ((add1twice (x)
              (add1 (add1 x))))
      (add1twice x))))

选项2

(defun add2 (x) 
  (flet ((add1twice (x)
            (flet ((add1 (x) (1+ x)))
              (add1 (add1 x)))))
     (add1twice x)))

选项3

(defun add2 (x)
  (flet ((add1twice (x)
            (let (add1)
              (fset 'add1 (lambda (x) (1+ x)))
              (add1 (add1 x)))))
      (add1twice x)))

选项4

(labels ((add1 (x) (1+ x)))
  (defun add2 (x) 
    (flet ((add1twice (x)
              (add1 (add1 x))))
      (add1twice x))))

(所有这些都产生相同的结果。)

lisp elisp
3个回答
1
投票

尽管在the documentation for flet中不太清楚,但是它的宏扩展表明它可以容忍顺序绑定:

flet

文档中提到建立“ (defun add2 (x) (flet ((add1 (x) (1+ x)) (add1twice (x) (add1 (add1 x)))) (add1twice x))) 样式的绑定” — not let,但是上面的定义仍然有效。


2
投票

[您也有let*代表labels,就像flet代表let*


0
投票

顺便说一句,除了使用let,您还可以通过cl-labels手动进行此操作:

let*

诚然,它比(defun add2 (x) (let* ((add1 (lambda (x) (1+ x))) (add1twice (lambda (x) (funcall add1 (funcall add1 x))))) (funcall add1twice x))) cl-flet更为冗长。

© www.soinside.com 2019 - 2024. All rights reserved.