标签: let

Lisp DO变量语法推理

在Peter Seibel的Practical Common Lisp中,他给出了这个例子:

(do ((nums nil) (i 1 (1+ i)))
    ((> i 10) (nreverse nums))
  (push i nums))
Run Code Online (Sandbox Code Playgroud)

我可以看到它是如何工作的,在循环中使用nums但不给它一个步骤形式.为什么要将num放在变量定义中而不是这样做:

(let (nums) (do ((i 1 (+ i 1)))
         ((> i 10) (nreverse nums))
       (push i nums)))
Run Code Online (Sandbox Code Playgroud)

我确信这是一个很好的理由,但我还没有得到它.

lisp syntax let do-loops

6
推荐指数
1
解决办法
659
查看次数

方案:何时使用let,让*和letrec?

let,let*和letrec有什么区别?

请给出详尽的解释和例子.

scheme let

6
推荐指数
1
解决办法
1万
查看次数

Lisp,cffi,let和memory

我已经构建了一些玩具C++库来快速创建一个来自Lisp的Qt窗口.我知道common-qt存在,我只是想学习如何使用cffi.

现在,我有4个绑定功能:

  • create-application:创建一个QApplication并返回一个指针
  • create-window:创建一个QMainWindow并返回一个poiner
  • show:显示指定为参数的窗口
  • exec:Qt exec函数

这是一个完美运行的lisp代码:

(defctype t-app :pointer)
(defctype t-window :pointer)

(defcfun (create-application "create_application" ) t-app)
(defcfun (exec "exec") :void (app t-app))
(defcfun (create-window-aalt "create_window_aalt") t-window)
(defcfun (show "show") :void (o t-window))

(defparameter a (create-application))
(defparameter w (create-window-aalt))
(show w)
(exec a)
Run Code Online (Sandbox Code Playgroud)

但如果我使用LET或LET*......我有内存故障!

(let* ((a (create-application)) (w (create-window-aalt)))
    (show w)
    (exec a))


CORRUPTION WARNING in SBCL pid 1312(tid 140737353860992):
Memory fault at a556508 (pc=0x7ffff659b7f1, sp=0x7ffff2bbe688)
The integrity of this image is possibly compromised.
Exiting.
Run Code Online (Sandbox Code Playgroud)

有人知道为什么吗?

我正在使用SBCL:

env …
Run Code Online (Sandbox Code Playgroud)

lisp pointers sbcl let cffi

6
推荐指数
1
解决办法
641
查看次数

通过尽可能多地定义常量而不是变量,Swift有没有增益?

通过定义尽可能多的常量x变量,在Swift中,速度,内存使用等方面是否有任何增益?

我的意思是,尽可能多地定义let而不是var

variables var constants let swift

6
推荐指数
1
解决办法
415
查看次数

Swift'没有名为'的成员

有这个问题的解决方案吗?

class ViewController : UIViewController {
    let collectionFlowLayout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: collectionFlowLayout)
}
Run Code Online (Sandbox Code Playgroud)

xcode给我以下错误

ViewController.swift: 'ViewController.Type' does not have a member named 'collectionFlowLayout'
Run Code Online (Sandbox Code Playgroud)

我可以使它成为一个可选项并在init方法中初始化它,但我正在寻找一种方法来使collectionview成为let而不是var

xcode var let ios swift

6
推荐指数
1
解决办法
7843
查看次数

Clojure让vs Common Lisp让

在Common Lisp中,let使用绑定列表,即:

(let ((var1 1)
      (var2 2))
  ...)
Run Code Online (Sandbox Code Playgroud)

虽然Clojure使用向量代替:

(let [a 1
      b 2]
  ...)
Run Code Online (Sandbox Code Playgroud)

除了可读性之外,Clojure使用向量是否有任何具体原因?

lisp clojure common-lisp let

6
推荐指数
1
解决办法
671
查看次数

Chrome控制台:'let'和'var'之间的区别?

我附上了一个GIF动画来说明这种奇怪的行为.从本质上讲,我的问题是,Chrome是否控制台治疗varlet不同在同一范围内使用时?您会注意到,在声明/分配变量后,如果您尝试在控制台中输入该变量的名称,Chrome会自动为您自动填充,显示包含您输入内容的下拉列表.使用lets时,情况并非如此.这是一个错误,功能,还是我在JavaScript varletJavaScript中缺少的东西?

注意:我很清楚let生命和死亡在直接范围内.

在此输入图像描述

javascript google-chrome var let google-chrome-devtools

6
推荐指数
1
解决办法
507
查看次数

Scheme/Racket中letrec的含义

所以,据我了解,以下内容:let,let*,letrecletrec*在方案/球拍使用人工合成的糖.

现在,如果我有一个简单的程序:

(let ((x 1)
      (y 2))
     (+ x y))
Run Code Online (Sandbox Code Playgroud)

它被翻译成:

((lambda (x y) (+ x y)) 1 2)
Run Code Online (Sandbox Code Playgroud)

如果我有:

(let* ((x 1)
      (y 2))
     (+ x y))
Run Code Online (Sandbox Code Playgroud)

它被翻译成:

((lambda (x) ((lambda (y) (+ x y))) 2) 1)
Run Code Online (Sandbox Code Playgroud)

现在,对于我的第一个问题,我理解一个letrec表达式的含义,它允许一个人在let中使用递归,但我不明白它是如何完成的.什么是letrec翻译成?

例如,会是什么

(letrec ((x 1)
      (y 2))
     (+ x y)) 
Run Code Online (Sandbox Code Playgroud)

被翻译成?

第二个问题是类似的letrec*- 但letrec*我不明白它究竟有何不同letrec?而且,letrec*表达式将被翻译成什么?

scheme let racket letrec

6
推荐指数
1
解决办法
1867
查看次数

JS:如何防止让双重声明?/确定是否定义了变量

如果我打开JS控制台并写:

let foo;
Run Code Online (Sandbox Code Playgroud)

之后:

let foo = "bar"
Run Code Online (Sandbox Code Playgroud)

控制台告诉我(正确)

Uncaught SyntaxError: Identifier 'foo' has already been declared
Run Code Online (Sandbox Code Playgroud)

现在......有时我需要在现有脚本中注入我的代码,而我没有工具来确定是否已经定义了let变量.

我尝试使用此代码,但JS范围和逻辑存在明显问题....(注释代码)

let foo; // Gloabl variable empty declare in a code far, far away 

console.log(foo); // undefined

console.log(typeof foo === "undefined"); // test that determinate if condition is true

if(typeof foo === "undefined"){
    let foo = "test";
    console.log(foo); // return "test" this means that foo as a local scope only inside this if... 
}

console.log(foo); // return undefined not test!

// and …
Run Code Online (Sandbox Code Playgroud)

javascript variables let ecmascript-6

6
推荐指数
1
解决办法
126
查看次数

let表达式中的case表达式是否需要大括号和分号?

我对Haskell的解析规则感到困惑。

这很漂亮:

n = 5
m = 6
b = case (n, m) of
  (5, 6) -> True
  _ -> False

main = print b
Run Code Online (Sandbox Code Playgroud)

让我们把它复杂化得很小,让我们let在混合物中添加一个:

b =
  let res = case (n, m) of
    (5, 6) -> True
    _ -> False
  in not res
Run Code Online (Sandbox Code Playgroud)

(注意,为了简便起见,我省略的定义nmmain从现在开始,他们进行相同的,我只是改变b

糟糕,这里的问题:

wtf.hs:5:5: error: parse error on input ‘(’
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

我不知道,也许那是我没有得到的某种奇怪的缩进规则。好的,让我们用括号括起来:

b =
  let res = case (n, m) of {
    (5, …
Run Code Online (Sandbox Code Playgroud)

haskell let switch-statement

6
推荐指数
1
解决办法
132
查看次数