球拍中的guile程序源?

| 球拍是否具有类似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
    

要回复问题请先登录注册