问题描述
|
球拍是否具有类似guile的过程源功能的内容,例如:
(定义(+1)(+1 x))
(过程源加一)->(引号(+1 x))
我正在尝试为初学者设计一种类似于调试工具的工具,在该工具中,当他们以2htdp / universe的方式玩游戏时,他们可以看到特定功能的部分或完整评估。因此,在这种情况下,我可以使用宏,除非在他们的程序中,我仍然希望定义看起来像往常一样,所以我不能只是让他们首先引用它,然后再评估它,除非我重新定义定义...可能没问题,但是我希望您能对如何最好地完成操作感到满意。
解决方法
您遇到的问题是由于初学者对学生语言的限制:通常,高阶函数是该语言的语法错误,因为初学者尚不了解它们。
有一种方法可以退出。通过使用provider-higher-order-primitive,可以将您的过程源标记为此限制的例外之一,后者专门用于与BSL合作。
这是您的图书馆的外观:
#lang racket/base
(require lang/prim
racket/bool
(for-syntax racket/base))
(provide define/save-source)
(provide-higher-order-primitive procedure-name (fn))
(provide-higher-order-primitive procedure-source (fn))
(define *procedure-name-hash* (make-hash))
(define *procedure-source-hash* (make-hash))
(define (save-source! fn name body)
(hash-set! *procedure-name-hash* fn name)
(hash-set! *procedure-source-hash* fn body))
(define (procedure-name fn)
(hash-ref *procedure-name-hash* fn false))
(define (procedure-source fn)
(hash-ref *procedure-source-hash* fn false))
(define-syntax define/save-source
(syntax-rules ()
((_ (name formals ...) body-expressions ...)
(begin
(define name (λ(formals ...) body-expressions ...))
(save-source! name \'name \'(λ(formals ...) body-expressions ...))))
((_ name (λ(formals ...) body-expressions ...))
(begin
(define name (λ(formals ...) body-expressions ...))
(save-source! name \'name \'(λ(formals ...) body-expressions ...))))
((_ name value)
(define name value))))
使用此功能的BSL程序应能够使用procedure-name和procedure-source fine。
, 我已经做了这样的事情:
(provide (rename-out (def/help define)
(define-syntax/help define-syntax))
help)
(define-syntax def/help
(syntax-rules ()
((_ name description signature (λ(vs ...) exps ...))
(begin
(add-help! \'name description \'signature \'(λ(vs ...)))
(define name (λ(vs ...) exps ...))))))
...
> (require \"working.ss\")
> (define (plus a b) (+ a b))
X define: bad syntax in: (define (plus a b) (+ a b))
> (define plus
\"Add two numbers\"
(int int -> int)
(λ(a b) (+ a b)))
> (help plus)
plus
Add two numbers
(int int -> int)
(λ (a b))
(缺少一些肉,只是给出了一个主意。)如图所示,它不是超级坚固,但这是您所倾向的方向吗?
, 我最终得到的是:
(提供(重命名(定义/保存源定义))过程源)
然后在体内
(define *procedure-name-hash* (make-hash))
(define *procedure-source-hash* (make-hash))
(define (save-source! fn name body)
(hash-set! *procedure-name-hash* fn name)
(hash-set! *procedure-source-hash* fn body))
(define (procedure-name fn)
(hash-ref *procedure-name-hash* fn false))
(define (procedure-source fn)
(hash-ref *procedure-source-hash* fn false))
(define-syntax define/save-source
(syntax-rules ()
((_ (name formals ...) body-expressions ...)
(begin
(define name (λ(formals ...) body-expressions ...))
(save-source! name \'name \'(λ(formals ...) body-expressions ...))))
((_ name (λ(formals ...) body-expressions ...))
(begin
(define name (λ(formals ...) body-expressions ...))
(save-source! name \'name \'(λ(formals ...) body-expressions ...))))
((_ name value)
(define name value))))
并在副本中:
> (define/save-source (plus-one x) (+ 1 x))
> (procedure-source plus-one)
(λ (x) (+ 1 x))
> (plus-one 3)
4
>
奇怪的是,在学生代表中我得到:
> (procedure-source update-target)
(cons \'λ (cons (cons \'x empty) (cons (cons \'+ (cons \'x (cons 20 empty))) empty)))
> (update-target 30)
function call: expected a defined function name or a primitive operation name after an open parenthesis,but found something else