考虑以下函数来实现计算阶乘:[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
这可能是一件我想念的简单事情,但我正试图获得cdr一对,并且每次打电话(cdr (cons 'a '5))都会回来(5).我有点理解为什么,但是如果没有parens我怎么能让它返回呢?
我不想使用flatten因为我想要获得的(即cdr)本身可能是已经包含在parens中的另一个过程表达式,因此我不想将列表展平.
(如果重要的话,我正在努力将let表达式转换为lambda表达式,这是我正在采取的步骤之一,试图分解lambda绑定,以便我可以移动它们).
let-forms允许包含几个表达式:
(let ((x 4))
x
(+ x 1))
Run Code Online (Sandbox Code Playgroud)
回报5.
这个表达式是如何评估的?
如何在let构造之前或之内检查变量是否已定义?
(let (((if (boundp 'a)
'a
'dummy) t))
(message "I made this work"))
Run Code Online (Sandbox Code Playgroud)
我想要做的是检查之前是否a有界限,如果已经绑定,则将其绑定到t本地.否则根本不在乎a.
我想找出如何更改在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) 在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) guards在whereHaskell 之后是否可以使用定义函数?
这很好用:
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) 我是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?
我有一个我正在使用的不可变结构,我正在尝试创建一个不是计算值的属性,但是它的赋值需要先前分配的属性的值.
(哇满口).
我正在努力的财产是 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) 我脑海中的例子是:什么更好?
示例 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工作?它只是列表的语法糖还是使用其他东西?(例如一个数组)
如果这取决于实施,我会让您知道我正在使用鸡肉计划。
let ×10
scheme ×5
cdr ×1
clojure ×1
common-lisp ×1
coq ×1
elisp ×1
emacs ×1
evaluation ×1
factorial ×1
haskell ×1
lambda ×1
lisp ×1
properties ×1
racket ×1
struct ×1
swift ×1
syntax-error ×1
variables ×1
where ×1