标签: racket

Racket vs Scheme宏

球拍宏是否具有比Scheme或Common Lisp中更高级的功能?我怀疑,特别是关于模块,命名空间和范围等等,但我很欣赏一个简单的概述,即Racket宏可以做什么,如果有的话,其他lisps不能.

另外,Scheme/CL还将读者层暴露给开发人员,使用它,在这些lisps中不可能创建全新的语言(不仅仅是s-expr宏),比如Scribble,你可以在Racket中使用它吗?

换句话说,Racket只是一个围绕"语言导向编程"的哲学/惯例,为此目的使用方便的语法包装器,还是从根本上扩展Scheme以在该语言中做技术上不可能的事情?

非常感谢.

macros scheme racket

20
推荐指数
3
解决办法
1908
查看次数

球拍阅读器宏

有没有办法在Racket中制作简单的阅读器宏.我的意思是像这样的概括:

(define-reader-syntax "'" quote)
; finds expressions that start with "'" and wraps them in `(quote ...)`
'(foo) ; => (quote (foo))
'foo ; => (quote foo)
Run Code Online (Sandbox Code Playgroud)

我使用内置语法来明确我的意思.我想用它做的一件事就是复制clojure的速记lambda(#(+ 1 %) 5) ; => 6

看起来很容易定义一个"shorthand-lambda"宏并将"#"前缀映射到它.

lisp macros scheme racket

19
推荐指数
2
解决办法
1558
查看次数

为什么Scheme不支持一流的环境?

我一直在阅读SICP(计算机程序的结构和插入)并且非常兴奋地发现这种奇妙的特殊形式:"make-environment",他们证明它与eval结合使用作为编写模块化代码的一种方式(摘录)关于"包裹"的第4.3节:

(define scientific-library
  (make-environment
   ...
   (define (square-root x)
    ...)))
Run Code Online (Sandbox Code Playgroud)

然后他们演示了它的工作原理

((eval 'square-root scientific-library) 4)
Run Code Online (Sandbox Code Playgroud)

在他们的榜样,他们然后去证明正是我想要的使用-在计划做"OO"风格的优雅简约的方式......他们"利弊"在一起"类型",这实际上是什么由"make-environment"特殊形式(即vtable)和arg("the state")返回...

我非常兴奋,因为这正是我一直在寻找的一种方法,可以在Scheme中"按符号"进行多态调度,而无需编写大量显式代码或宏.

即我想创建一个"对象",其中包含两个函数,我在不同的上下文中调用...但我不想通过"car"和"cdr"来引用它们,我想两个都声明并用它们的象征性名称来评估它们.

无论如何,当我读到这篇文章时,我迫不及待想回家试试看.

想象一下,当我在PLT计划和Chez计划中经历以下事件时,我感到很失望:

> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.
Run Code Online (Sandbox Code Playgroud)

在SICP中引用了"make-environment"怎么了?这一切看起来都很优雅,正是我想要的,但它似乎并没有得到任何现代Scheme解释器的支持?

理由是什么?简单地说"make-environment"有不同的名字吗?

稍后会发现更多信息

我看了看在线版:

http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28.html#%_sec_4.3

我正在阅读的是SICP的第一版.第二版似乎已经用关于非确定性编程和"放大器"运算符的部分取代了关于包的讨论.

scheme racket

18
推荐指数
2
解决办法
2687
查看次数

Racket中的`match`是否具有来自外部范围的变量的模式?

请考虑以下示例:

#lang racket

(match '(cat . doge)
  [`(,a . ,b)
   (match b
     [a #t]
     [_ #f])]
  [_ "Not a pair"])
Run Code Online (Sandbox Code Playgroud)

如果我想匹配头部和尾部相同的对,我可能会写这个.这不起作用,因为第二个a绑定为一个新变量(并匹配任何东西).是否有任何模式形式允许我使用以前a从外部范围绑定的模式?

我知道这可以通过以下方式实现

(match* ('cat 'doge)
  [(a a) #t]
  [(_ _) #f])
Run Code Online (Sandbox Code Playgroud)

但我仍然想知道是否有办法从外部范围获取该变量(或者如果有理由不这样做,就像一些潜在的名称冲突问题或其他东西).

scheme scope pattern-matching racket

18
推荐指数
1
解决办法
442
查看次数

letrec有什么好处?

在阅读"The Seasoned Schemer"时,我开始学习letrec.我理解它的作用(可以用Y-Combinator复制),但本书正在使用它来代替在已define保持静态参数的已经d函数上重复出现.

使用defined函数重复出现的旧函数示例(没什么特别的):

(define (substitute new old l)
  (cond
    ((null? l) '())
    ((eq? (car l) old)
      (cons new (substitute new old (cdr l))))
    (else
      (cons (car l) (substitute new old (cdr l))))))
Run Code Online (Sandbox Code Playgroud)

现在有一个相同功能的例子,但使用letrec:

(define (substitute new old l)
  (letrec
    ((replace
      (lambda (l)
        (cond
          ((null? l) '())
          ((eq? (car l) old)
           (cons new (replace (cdr l))))
          (else
           (cons (car l) (replace (cdr l))))))))
(replace lat)))
Run Code Online (Sandbox Code Playgroud)

除了稍微长一点,更难以阅读之外,我不知道他们为什么要在书中重写函数来使用letrec.通过这种方式在静态变量上重复出现时是否有速度增强,因为你没有继续传递它?

对于具有参数的函数,这种标准实践是保持静态还是减少了一个参数(例如重复列表的元素)?

来自更有经验的Schemers/LISPers的一些意见将有所帮助!

lisp scheme functional-programming racket letrec

17
推荐指数
1
解决办法
7398
查看次数

什么是方案相当于元组解包?

在Python中,我可以这样做:

t = (1, 2)
a, b = t
Run Code Online (Sandbox Code Playgroud)

......并且a将为1,b将为2.假设我'(1 2)在Scheme中有一个列表.有没有办法做类似的事情let?如果它有所作为,我正在使用Racket.

scheme list racket iterable-unpacking

17
推荐指数
3
解决办法
5411
查看次数

set-car !, set-cdr!球拍没有束缚?

我只是想与做的非常简单的代码set-car!,并set-cdr!racket,但我得到了错误:expand: unbound identifier in module in: set-car!expand: unbound identifier in module in: set-cdr!

它们不是定义的racket吗?有人可以帮忙吗?

scheme racket

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

在REPL中使用#lang设置语言

我想动态设置REPL中的语言,而#lang不是使用"-I"命令行参数.但这给了我错误"读取:#lang在当前上下文中未启用".

是否有我缺少的命令行开关?或者也许我可以使用",metacommand"?我需要这个的原因是因为我希望能够将一个Emacs缓冲区发送到Racket REPL,但是如果该文件以#lang.

racket geiser

17
推荐指数
2
解决办法
3323
查看次数

关于Scheme中的"If .."(plt-scheme)

在我的Scheme程序中,我有一个非常简单的要求,即在'if' 的真实条件下执行多个语句..所以我写了我的代码,如下所示:

(if (= 1 1)
 ((expression1) (expression2))  ; these 2 expressions are to be
                                ; executed when the condition is true
  (expression3))
Run Code Online (Sandbox Code Playgroud)

显然,上面的方法不起作用,因为我无意间用#参数创建了一个#过程.因此,为了完成我的工作,我只需将上面的表达式放在一个新函数中,然后从那里调用它,代替expression1,expression2.有用.

所以,我的观点是:是否有其他条件结构可以支持我的要求?

lisp scheme racket

16
推荐指数
1
解决办法
1万
查看次数

在Scheme中将String转换为整数

如何将一串数字转换为整数?我想将"365"转换为365.

我试过的,string-> list然后char-> integer,但这会返回该整数的ASCII值,我该如何获得该整数?

请帮忙.

scheme racket

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