标签: let

Swift 的 var list.enumerated()

我有一个对象数组,其类型是具有变异函数的结构。所以我得到了这个代码:

for (index, object) in objects.enumerated() {
     otherArray[index] = object.someMutatingFunction(...)
}
Run Code Online (Sandbox Code Playgroud)

这导致我出现此错误Cannot use mutating member on immutable value of type 'Blabla',我可以通过添加 var 来修复该错误:

for var (index, object) in objects.enumerated() {
     otherArray[index] = object.someMutatingFunction(...)
}
Run Code Online (Sandbox Code Playgroud)

但后来我收到另一个警告Variable 'index' was never mutated; consider changing to 'let' constant,我不知道如何优雅地修复。唯一的想法是添加一个新的 var 变量。我还能做些什么来防止出现此警告吗?

for-loop var let swift

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

对 let 到 lambda 的转换感到困惑

我目前正在阅读Mike Vanier撰写的关于 Y-combinator的这篇很棒的文章。在解释中删除了以下行:

事实证明,任何 let 表达式都可以使用以下等式转换为等效的 lambda 表达式:

(let ((x <expr1>)) <expr2>) ==> ((lambda (x) <expr2>) <expr1>)

文章通过转换来说明这个语句:

(define (part-factorial self)
  (let ((f (self self)))
    (lambda (n)
      (if (= n 0)
        1
        (* n (f (- n 1)))))))
Run Code Online (Sandbox Code Playgroud)

到:

(define (part-factorial self)
  ((lambda (f)
    (lambda (n)
      (if (= n 0)
        1
        (* n (f (- n 1))))))
  (self self)))
Run Code Online (Sandbox Code Playgroud)

现在,我明白了上面两个代码片段是如何以及为什么是相同的,尽管我无法理解转换let为的一般方程lambda是:

(let ((x <expr1>)) <expr2>)
==> ((lambda (x) <expr2>) <expr1>)
Run Code Online (Sandbox Code Playgroud)

我很感激详细的解释。

lisp lambda scheme let racket

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

JavaScript let 双重声明

我知道 JS 中的 let 不能声明变量两次。但是当我在控制台中尝试以下代码时:

a = 1;
let a = 2;
let a = 3;
    .
    .
    .
let a = 100;
Run Code Online (Sandbox Code Playgroud)

注意:它们是逐行运行的(如下面的屏幕截图所示)。版本是谷歌浏览器91.0.4472.114

在此输入图像描述

它总是有效,没有错误。这真的让我很困惑,为什么它工作得很好?我知道控制台中发生的情况并不代表脚本中发生的情况。但我的问题是为什么它存在于控制台中?这有什么原因吗,或者可能是一个错误?

因为我假设let和const具有相同的声明行为,如果我使用const而不是let,这是毫无疑问的。

b = 1;
const b = 2;
const b = 3; //Uncaught SyntaxError: Identifier 'b' has already been declared
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

javascript declaration let google-chrome-console

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

请问什么是'留言回复类型?

我正在关注elisp的介绍.第一章.这是我从html书中复制/粘贴的两个例子.我已经评估了两种形式,在这里我复制/粘贴返回的值和输出作为*Messages*缓冲区的副作用(我不知道如何复制迷你缓冲区内容).

第一种形式

(let ((zebra 'stripes)
      (tiger 'fierce))
  (message "One kind of animal has %s and another is %s."
           zebra tiger))
Run Code Online (Sandbox Code Playgroud)

来自*消息*的输出

One kind of animal has stripes and another is fierce.
#("One kind of animal has stripes and another is fierce." 23 30 (fontified t))
Run Code Online (Sandbox Code Playgroud)

第二种形式

(let ((birch 3)
      pine
      fir
      (oak 'some))
  (message "Here are %d variables with %s, %s and %s value."
           birch pine fir oak))
Run Code Online (Sandbox Code Playgroud)

*Messages*的输出是:

Here are 3 variables with nil, nil and some value.
"Here …
Run Code Online (Sandbox Code Playgroud)

emacs elisp let

2
推荐指数
1
解决办法
89
查看次数

Clojure交换!不在let绑定中的map函数内部工作

我有两个序列用于比较,我需要在地图中保留比较结果,第一个序列中的数据用作键,第二个用作val.这是一个有效的示例代码

(def myAtom  (atom {}))

(map #(if (== %1 %2) (swap! myAtom assoc %1 %2 ))
              [1 2 3]   [4 5 3]) 

(prn @myAtom)  ; ==>  {3 3}
Run Code Online (Sandbox Code Playgroud)

然而,在将"相同"的东西放到一个let绑定之后,它就不再起作用了

(let  [ myAtom  (atom {})]    
  (map #(if (== %1 %2) (swap! myAtom assoc %1 %2 ))
              [1 2 3]   [4 5 3]) 
  (prn @myAtom)) ;;==> {} empty???
Run Code Online (Sandbox Code Playgroud)

所以问题是,myAtom里面发生了什么让绑定?怎么会丢失?

swap dictionary clojure let

2
推荐指数
1
解决办法
983
查看次数

如何使用lambda实现let*

我正在做lambda演算,在我的教科书中,它说你将如何let*使用lambda演算.

我的答案:x,y和z是参数; v1,v2和v3参数; e是身体:

((lambda (x y z) (e)) v1 v2 v3)
Run Code Online (Sandbox Code Playgroud)

书中的答案:

  ((lambda(x)
    ((lambda(y)
      ((lambda(z) e) v3))
      v2))
    v1)
Run Code Online (Sandbox Code Playgroud)

我不确定我的回答是否相同.如果没有,为什么我的回答是错误的,如何得出原始答案?

lambda scheme lambda-calculus let

2
推荐指数
1
解决办法
235
查看次数

为什么"让"es6和谐仅适用于严格使用?

这段代码:

var x = 8,
    y = 12;

let ( x = 5, y = 10) {
   return x + y;
} 
Run Code Online (Sandbox Code Playgroud)

..gives"SyntaxError:非法让扩展模式外的声明"

但是"使用严格"它可以正常工作.

所以有趣的是为什么'让'首先与"使用严格"模式集成?(根据http://kangax.github.io/compat-table/es6/#nodeharmony)

let use-strict node.js ecmascript-6

2
推荐指数
1
解决办法
1425
查看次数

Clojure - recur适用于循环或let语句?

我在Clojure中有一个关于复发的问题.如果我在循环中有一个let语句,那么recur调用是否可以应用于let语句而不是循环的值?例如,在这种情况下:

(defn someFunction [listA listB]
  ("do something here...." 
      [new-listA new-listB]))

(defn anotherFunction [listA listB]
  ("do something here...." 
      [new-listA new-listB]))

(defn myFunction [firstList secondList]
  (loop [list1 (someMutation firstList)
         list2 (someMutation secondList)]
    (if (= "true" (someCondition))
      (let [[newlist1 newlist2]
           (someFunction list1 list2)] 
        (recur newlist1 newlist2))
      (anotherFunction list1 list2) )))
Run Code Online (Sandbox Code Playgroud)

是(recur newlist1 newlist2)应用于循环还是let?有没有一种方法可以跳过这个let语句并直接使用"someFunction"返回的两个值调用recur,假设我不能改变"someFunction"返回带有两个参数的向量这一事实?

recursion loops clojure let

2
推荐指数
1
解决办法
686
查看次数

使用let重写表达式

我一直在教方案语言,在我的教科书中,我按下了以下表达式。我的问题是为什么要对数字“ 10”进行评估?有人可以向我解释吗?意思是创建什么本地环境以及创建到符号的绑定。我也知道每个lambda表达式都可以使用重写let。任何想法如何做到这一点?我将不胜感激任何帮助。

(let ((x 10)) 
  (define y (lambda (x) x)) 
  (define x 5) 
  (+ x (y x)))
Run Code Online (Sandbox Code Playgroud)

lambda scheme let racket

2
推荐指数
1
解决办法
91
查看次数

在GHC 8.6.5中是否已删除在do块中使用let语句的功能?

我在中输入了一些代码ghci,类似于以下代码:

main = do { a <- getLine ; let b = "Hello " ++ a ; putStrLn b }
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

<interactive>:1:63: error: parse error on input `}'
Run Code Online (Sandbox Code Playgroud)

在Haskell / GHC的早期版本中,我记得这种方法工作得很好-甚至明确指出,在do块中,您不需要in关键字。但是,使它起作用的唯一方法似乎是:

main = do { a <- getLine ; let b = "Hello " ++ a in putStrLn b }
Run Code Online (Sandbox Code Playgroud)

不会产生此错误。

这个被删除了吗?如果是这样,我是否需要dolet in表达式中添加第二个块?

syntax monads haskell let do-notation

2
推荐指数
1
解决办法
83
查看次数