Scheme或者方言的任何方言都有一种"自我"操作符,这样匿名的lambdas就可以重复自己,而不需要像Y-combinator那样做或者在letrec等中命名.
就像是:
(lambda (n)
(cond
((= n 0) 1)
(else (* n (self (- n 1)))))))
Run Code Online (Sandbox Code Playgroud) "interned"和"uninterned"符号之间有什么区别.只有Racket有没有符号的符号或做其他方案的方案或者lisp有它们吗?
我正在通过The LIttle Schemer来学习Scheme(作为一个老C程序员),作为一个练习,我试图编写一个程序,仅使用The Little Schemer中的表格来展平列表; 即define,lambda,cond,car,cdr,and,or,等,但没有 append.我认为这很容易,但我无法提出解决方案.我怎样才能做到这一点 ?
我正在通过Kent Dybvig的"计划编程语言"来学习Scheme宏.
在第8.2节 http://www.scheme.com/tspl4/syntax.html#./syntax:h2 他有"或"宏的例子
(define-syntax or
(syntax-rules ()
((_) #f)
((_ e) e)
((_ e1 e2 e3 ...)
(let ((t e1)) (if t t (or e2 e3 ...))))))
Run Code Online (Sandbox Code Playgroud)
有什么理由他没有使用更简单的形式:
(define-syntax or
(syntax-rules ()
((_) #f)
((_ e) e)
((_ e1 e2 ...)
(let ((t e1)) (if t t (or e2 ...))))))
Run Code Online (Sandbox Code Playgroud)
这两种形式是否等同扩展?
在Scheme或Racket中是否可以检测函数的调用者?
例如,我可以编写一个函数来测试列表是否是原子列表,如下所示:
(define atom? (lambda (x) (and (not (pair? x)) (not (empty? x)))))
(define lat? (lambda (l)
(define latt?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (latt? (cdr l)))
(else #f))))
(if (null? l) #f (latt? l))))
Run Code Online (Sandbox Code Playgroud)
但不是上面的,有一个像"被叫"这样的函数做这样的事情:
(define lat?
(lambda (l)
(cond
((and (null? l) (called-by "lat?")) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
Run Code Online (Sandbox Code Playgroud) 在DrRacket中使用Racket时,我意外地进入了交互窗口.
(定义x 7)
(定义x 8)
并且DrRacket允许它,即我没有得到"标识符错误消息的重复定义".
因此,要尝试找出发生了什么,然后在DrRacket的定义窗口中输入:
代码段A
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval '(begin (define x 7) (define x 8)) ns)
(eval 'x ns)
Run Code Online (Sandbox Code Playgroud)
仍然没有"重复定义错误".
然后我在定义窗口中尝试了这个:
代码段B
(define x 9)
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval '(begin (define x 7) (define x 8)) ns)
(eval 'x ns)
Run Code Online (Sandbox Code Playgroud)
我收到了错误消息:cannot redefine a constant x.
有人可以向我解释为什么在定义窗口中的代码片段A(并且只是在交互窗口中输入 (define x 7) 后面(define x 8))不会给我一个重复的定义错误.
当我学习计划和球拍时,我发现自己一次又一次地重复这种模式.我有一个递归函数,其中函数的一些参数改变但一些参数没有.我构建了一个外部函数,它接受所有参数并在其中定义一个内部函数,该函数仅接受更改的参数并重复该参数.
作为一个具体的例子,一个案例基于"小计划者"的功能练习
;inserts an item to the right of an element in a list
(define (insert-to-right new old lat)
(define (insert-to-right lat)
(cond
[(null? lat) lat]
[(eq? old (car lat) ) (cons old (cons new (cdr lat)))]
[else (cons (car lat) (insert-to-right (cdr lat)))]))
(insert-to-right lat))
Run Code Online (Sandbox Code Playgroud)
是否可以构建一个宏定义*和一个运算符(例如一个垂直条),以便我输入:
(define* (insert-to-right new old | lat)
(cond
[(null? lat) lat]
[(eq? old (car lat) ) (cons old (cons new (cdr lat)))]
[else (cons (car lat) (insert-to-right (cdr lat)))]))
Run Code Online (Sandbox Code Playgroud)
然后,这会扩展为第一种形式,所有参数都传递给外部函数,但只有垂直条传递给内部循环后的参数.