小编Har*_*ier的帖子

匿名的lambdas直接指自己

Scheme或者方言的任何方言都有一种"自我"操作符,这样匿名的lambdas就可以重复自己,而不需要像Y-combinator那样做或者在letrec等中命名.

就像是:

(lambda (n)
   (cond
     ((= n 0) 1)
     (else (* n (self (- n 1)))))))
Run Code Online (Sandbox Code Playgroud)

scheme racket

5
推荐指数
2
解决办法
434
查看次数

"interned"和"uninterned"符号之间有什么区别

"interned"和"uninterned"符号之间有什么区别.只有Racket有没有符号的符号或做其他方案的方案或者lisp有它们吗?

scheme racket

4
推荐指数
1
解决办法
597
查看次数

仅使用"The Little Schemer"中的表单展平列表

我正在通过The LIttle Schemer来学习Scheme(作为一个老C程序员),作为一个练习,我试图编写一个程序,使用The Little Schemer中的表格来展平列表; 即define,lambda,cond,car,cdr,and,or,等,但没有 append.我认为这很容易,但我无法提出解决方案.我怎样才能做到这一点 ?

scheme the-little-schemer

3
推荐指数
1
解决办法
2350
查看次数

方案宏为"或"

我正在通过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

3
推荐指数
1
解决办法
267
查看次数

检测Scheme或Racket中函数的调用者

在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)

scheme racket

2
推荐指数
1
解决办法
197
查看次数

在Racket中eval中允许的标识符重复定义?

在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))不会给我一个重复的定义错误.

scheme racket

2
推荐指数
1
解决办法
1262
查看次数

宏来简化递归函数语法

当我学习计划和球拍时,我发现自己一次又一次地重复这种模式.我有一个递归函数,其中函数的一些参数改变但一些参数没有.我构建了一个外部函数,它接受所有参数并在其中定义一个内部函数,该函数仅接受更改的参数并重复该参数.

作为一个具体的例子,一个案例基于"小计划者"的功能练习

;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)

然后,这会扩展为第一种形式,所有参数都传递给外部函数,但只有垂直条传递给内部循环后的参数.

scheme racket

2
推荐指数
1
解决办法
520
查看次数

标签 统计

scheme ×7

racket ×5

the-little-schemer ×1