方案中是什么?我们如何使用它?
scm> (define (x) 100)
x
scm> (x)
100
scm> x ; When we "called" x, it return (lambda () 100). what is it ?
(lambda () 100)
Run Code Online (Sandbox Code Playgroud) 在为MIT/GNU Scheme (rel 9.2 ) 中的odd和even函数开发经典练习代码时,我遇到了一个问题,即我的代码不会因大整数值而终止。首先,我测试了以下代码,它处理正值和负值:
(define error-message-number "Error. x must be a number")
(define odd?
(lambda (x)
(cond
((not (integer? x)) error-message-number)
((= x 0) #f)
((< x 0) (even? (+ x 1))) ;for negatives
(else (even? (- x 1)))))) ;if number n is odd then n - 1 is even
(define even?
(lambda (x)
(cond
((not (integer? x)) error-message-number)
((= x 0) #t)
((< x 0) (odd? (+ x 1))) ;for negatives
(else …Run Code Online (Sandbox Code Playgroud) 在谈论 Painters 时,SICP 使用定义如下的程序:
(define (segments->painter segment-list)
...
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,文本并没有(还?)说明什么->代表什么。->Scheme中的用法是什么?例如,显示段将被视为画家的“方法”(或者反之亦然)是否是 OOP 风格的事情?我唯一见过这个->符号的地方是在 C 中,当然我们在这里不处理指针,所以我有点不清楚它是如何使用的或它在什么约定中使用。
在 Racket 中,一种点分隔数字(例如软件的版本号)如何?
例如
'("1.1.2" "1.0.0" "1.3.3" "1.0.7" "1.0.2")
Run Code Online (Sandbox Code Playgroud)
分类为
'("1.0.0" "1.0.2" "1.0.7" "1.1.2" "1.3.3")
Run Code Online (Sandbox Code Playgroud) 在我的一本书中,我有这个方案代码,并想将其转换为 Common Lisp:
(define (make-account balance)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (dispatch m)
(cond
((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else (error "Unknown request -- MAKE-ACCOUNT" m))))
dispatch)
Run Code Online (Sandbox Code Playgroud)
然后我将使用以下命令创建它:
(define acc (make-account 1500))
Run Code Online (Sandbox Code Playgroud)
然后调用deposit或withdraw:
((acc 'withdraw) 50)
或者
((acc 'deposit) 75)
据我了解,
acc被函数替换dispatch并返回withdrawordeposit
然后计算表达式,例如:
((acc 'withdraw) 50) …
为什么结果(cons (list 1 2) (list 3 4))是((1 2) 3 4)?
我想知道为什么结果长度为3(3个元素).我的直觉让我觉得这
(list 1 2)是一个列表,(list 3 4)也是一个列表.通过使用cons过程,结果应该是两个元素,每个元素都是一个列表,但结果并不像我期望的那样.
谁能告诉我为什么?谢谢.
使用mit-scheme尝试一些Lisp。
(define (inv curstate x y)
((cond (= y 1) curstate)
(cond (even? y)
(inv (square curstate) x (/ y 2)))
(else
(inv (* x curstate) x (- y 1)))))
Run Code Online (Sandbox Code Playgroud)
解释器错误:
格式错误的子句:curstate
另一个版本使用线性递归方法,因此存在类似的错误。该怎么办?
问题:
编写一个函数(split l),它接受一个列表并将其分成两个大小相同(在一个内)的列表,并返回一个对,其car是第一个列表,其cdr是第二个列表.
我的代码:
(define split list)
(let ((half (/ (length list) 2)
(cons (car half list)
(cdr half list))))
Run Code Online (Sandbox Code Playgroud)