在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)
我确信这是一个很好的理由,但我还没有得到它.
我已经构建了一些玩具C++库来快速创建一个来自Lisp的Qt窗口.我知道common-qt存在,我只是想学习如何使用cffi.
现在,我有4个绑定功能:
这是一个完美运行的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) 通过定义尽可能多的常量x变量,在Swift中,速度,内存使用等方面是否有任何增益?
我的意思是,尽可能多地定义let而不是var?
有这个问题的解决方案吗?
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
在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使用向量是否有任何具体原因?
我附上了一个GIF动画来说明这种奇怪的行为.从本质上讲,我的问题是,Chrome是否控制台治疗var和let不同在同一范围内使用时?您会注意到,在声明/分配变量后,如果您尝试在控制台中输入该变量的名称,Chrome会自动为您自动填充,显示包含您输入内容的下拉列表.使用lets时,情况并非如此.这是一个错误,功能,还是我在JavaScript var和letJavaScript中缺少的东西?
注意:我很清楚let生命和死亡在直接范围内.
所以,据我了解,以下内容:let,let*,letrec并letrec*在方案/球拍使用人工合成的糖.
现在,如果我有一个简单的程序:
(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*表达式将被翻译成什么?
如果我打开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)我对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)
(注意,为了简便起见,我省略的定义n,m并main从现在开始,他们进行相同的,我只是改变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)