标签: let

为什么不让`let`用于命名内部递归过程?

考虑以下函数来实现计算阶乘:[1]

(define fac-tail
  (lambda (n)
    (define fac-tail-helper
      (lambda (n ac)
        (if (= 0 n)
            ac
            (fac-tail-helper (- n 1) (* n ac)))))
    (fac-tail-helper n 1)))
Run Code Online (Sandbox Code Playgroud)

我试图用let内部定义重写:

(define fac-tail-2
  (lambda (n)
    (let ((fac-tail-helper-2
            (lambda (n ac)
              (if (= 0 n)
                  ac
                  (fac-tail-helper-2 (- n 1) (* n ac))))))
    (fac-tail-helper-2 n 1))))
Run Code Online (Sandbox Code Playgroud)

define时间没有错误,但执行结果为:

#;> (fac-tail-2 4)
Error: undefined variable 'fac-tail-helper-2'.
{warning: printing of stack trace not supported}
Run Code Online (Sandbox Code Playgroud)

如何使let版本有效?

方案版本是SISC v 1.16.6

[1]基于factorialSICP第1.2.1节的迭代版本http://mitpress.mit.edu/sicp/full-text/book/book-ZH-11.html#%_sec_1.2.1

lambda scheme factorial let

3
推荐指数
2
解决办法
892
查看次数

方案:获得没有parens的cdr

这可能是一件我想念的简单事情,但我正试图获得cdr一对,并且每次打电话(cdr (cons 'a '5))都会回来(5).我有点理解为什么,但是如果没有parens我怎么能让它返回呢?

我不想使用flatten因为我想要获得的(即cdr)本身可能是已经包含在parens中的另一个过程表达式,因此我不想将列表展平.

(如果重要的话,我正在努力将let表达式转换为lambda表达式,这是我正在采取的步骤之一,试图分解lambda绑定,以便我可以移动它们).

scheme let racket cdr

3
推荐指数
1
解决办法
469
查看次数

如何评估let-forms?

let-forms允许包含几个表达式:

(let ((x 4))
   x
  (+ x 1))
Run Code Online (Sandbox Code Playgroud)

回报5.

这个表达式是如何评估的?

evaluation scheme let

3
推荐指数
1
解决办法
715
查看次数

Elisp:在let中绑定

如何在let构造之前或之内检查变量是否已定义?

 (let (((if (boundp 'a)
           'a
         'dummy) t))
   (message "I made this work"))
Run Code Online (Sandbox Code Playgroud)

我想要做的是检查之前是否a有界限,如果已经绑定,则将其绑定到t本地.否则根本不在乎a.

emacs elisp let

3
推荐指数
1
解决办法
442
查看次数

是否可以修改let绑定?

我想找出如何更改在Clojure函数的let绑定中声明的变量的值.下面是我正在使用的代码.我希望函数返回java.lang.String对象,该对象包含String中包含的文本.

(defn read-text-from-file
  {:doc "fn read-text-from-file is used to output in \"string\"
format the text in a file."}
  [#^String file-name]
  (let [buff-reader (open-file-reader file-name)]
  (loop [full-text "" line (.readLine buff-reader)]
    (when line
      (-> full-text (.concat line))
;      (println full-text)
      (recur (-> file-name (.concat line)) (.readLine buff-reader))))))
Run Code Online (Sandbox Code Playgroud)

注意:"open-file-reader"功能如下:

(defn open-file-reader
  {:doc "This is used to open a file, ready for reading"}
  [file-name]
  (let [file-object (java.io.File. file-name)
        buff-reader (-> file-object (java.io.FileReader.)
                        (java.io.BufferedReader.))]
    buff-reader))
Run Code Online (Sandbox Code Playgroud)

variables clojure let

3
推荐指数
1
解决办法
202
查看次数

Common Lisp和Scheme词法闭包之间的差异

在Common Lisp中,我可以评估以下代码片段(在SBCL中),而不会发出任何语法错误信号:

(let ((x 0))
   (defun my-incf (y)
     (setf x (+ x y)))
   (defun my-decf (y)
     (setf x (- x y))))
MY-DECF

CL-USER> (my-incf 1)
1
CL-USER> (my-incf 1)
2
CL-USER> (my-decf 1)
1
CL-USER> (my-decf 1)
0
Run Code Online (Sandbox Code Playgroud)

当我尝试评估相应的Scheme代码片段时(在DrRacket中):

(let ((x 0))
  (define (my-incf y)
    (set! x (+ x y)))
  (define (my-decf y)
    (set! x (- x y))))
Run Code Online (Sandbox Code Playgroud)

它表示语法错误.

begin (possibly implicit): no expression after a sequence of internal definitions in: (begin (define (my-incf y) (set! x (+ x y))) …
Run Code Online (Sandbox Code Playgroud)

lisp scheme lexical-closures common-lisp let

3
推荐指数
1
解决办法
720
查看次数

哈斯克尔:在哪里使用警卫

guardswhereHaskell 之后是否可以使用定义函数?

这很好用:

myMax a b = a + b - myMin a b
    where myMin a b = if a < b then a else b
Run Code Online (Sandbox Code Playgroud)

但是这个

myMax a b = a + b - myMin a b
    where myMin a b
    | a < b      = a
    | otherwise  = b
Run Code Online (Sandbox Code Playgroud)

将在ghci中抛出以下错误消息:

parse error (possibly incorrect indentation or mismatched brackets)
Run Code Online (Sandbox Code Playgroud)

在对应的行上 | a < b = a

同样,这将工作:

myMax a b = 
  let myMin a …
Run Code Online (Sandbox Code Playgroud)

haskell where let

3
推荐指数
1
解决办法
485
查看次数

Coq let子句中的多个分配

我是Coq的新手,只是想弄清楚基本语法。如何添加多个子句let?这是我要编写的函数:

Definition split {A:Set} (lst:list A) :=
  let
    fst := take (length lst / 2) lst
    snd := drop (length lst / 2) lst
  in (fst, snd) end.
Run Code Online (Sandbox Code Playgroud)

这是错误:

语法错误:在[constr:operconstr级别200]之后(在[constr:binder_constr]中)应为'in'。

我猜想它in的定义是fst

syntax-error let coq

3
推荐指数
1
解决办法
923
查看次数

懒惰让?结构中不合理的解决方法

我有一个我正在使用的不可变结构,我正在尝试创建一个不是计算值的属性,但是它的赋值需要先前分配的属性的值.

(哇满口).

我正在努力的财产是 perimeter: Int

// Floor made out of square tiles.
struct Floor { 

  let
  size:           (x: Int, y: Int), // How many tiles in the floor
  tilePerimeter:  Int,

  // Calculate entire floor's perimeter based on tile quantity and perimeter:
  lazy let perimeter: Int = {

    let
    t4th  = self.tilePerimeter / 4,  // Tile width / length
    sx    = self.size.x * t4th,      // All X tiles' length
    sy    = self.size.y * t4th       // All Y tiles' width …
Run Code Online (Sandbox Code Playgroud)

struct properties let lazy-initialization swift

3
推荐指数
1
解决办法
587
查看次数

使用 let-values 而不是 let 有什么好处?

我脑海中的例子是:什么更好?

示例 1:

(define (foo x)
  ...
  (values a b c))

(let-values (((a b c) (foo  42)))
    ...)
Run Code Online (Sandbox Code Playgroud)

示例 2:

(define (foo x)
  ...
  (list a b c))

(let ((f (foo 42)))
  (let ((x (first f)) (y (second f)) (z (third f)))
      ...))
Run Code Online (Sandbox Code Playgroud)

我粗略的猜测是,第一种方法是最好的,因为在第二,因为每当有呼叫first/ second/third它在列表中有迭代。所以我的问题变成:如何values工作?它只是列表的语法糖还是使用其他东西?(例如一个数组)

如果这取决于实施,我会让您知道我正在使用鸡肉计划。

scheme let chicken-scheme

3
推荐指数
1
解决办法
966
查看次数