添加对新表达式方案语言的支持
add support to new expression scheme language
我是新来的。马上就要考试了,考试语言方案,我正在准备中
我有一个问题,我花了几个小时尝试解决,但我什至不知道如何开始。
问题是这样的:
有这种形式的新表达式:
(get-procedure-body <exp>)
此表达式接收单个表达式作为参数,对其求值,如果获得用户过程类型值,returns
她body.
方案语言问题
大家好,我是新来的。我马上就要考试了,语言测试,我正在准备中。
我有一个问题,我花了几个小时尝试解决,但我什至不知道如何开始。
问题是这样的:
有这种形式的新表达:
此表达式接收单个表达式作为参数,对其求值,如果获得用户过程类型值,returns
她body.
以下是重估后的可能情况:
- 如果返回值是用户过程 - 必须返回其 body
- 如果返回值是原始过程——“隐藏实现!原始“
- 如果该值不是过程,则打印“procedure-non:错误”
函数运行可能的输出:
(get-procedure-body f)
> ((display x) (* x y))
(get-procedure-body (lambda (x) (h x)) )
> ((h x))
(get-procedure-body +)
> “primitive! Implementation hidden”
(get-procedure-body 1)
> “error: non-procedure”
(get-procedure-body (+ 1 1))
> “error: non-procedure”
问题是这样的:
添加对 body-procedure-get 表达式作为内核表达式的支持(写入所有需要的更改)
如果有人至少能帮助我,我会很高兴,我试着解释自己,如果有什么不清楚的,告诉我,我会解释更多。这对我来说是很难的语言,尤其是因为它没有太多支持。
我什至不知道该怎么办。
获取过程的主体不是 Scheme 的一部分,也不是 Common Lisp 标准,但是如果您制作了支持用户过程的 Scheme 解释器 (eval
),您很可能拥有相关代码在您选择的数据结构中并制作非标准原语 get-procedure-body
将从宿主语言中公开相同的过程。例如。 SICP 这本书确实有一些名字非常相似的东西作为他们的解释器的一部分。
至于使用 Racket,我曾经使它能够做类似的事情:
#lang racket
(struct proc (src obj)
#:property prop:procedure
(struct-field-index obj)
#:transparent
#:methods gen:custom-write
[(define (write-proc x port mode)
((case mode
[(#t) write]
[(#f) display]
[else pretty-print])
(proc-src x)
port))])
(define-syntax lambda*
(syntax-rules ()
((_ . rest)
(proc '(lambda* . rest) (lambda . rest)))))
(define test (lambda* (x y) (+ x y)))
test ; ==> #(struct:closure (lambda* (x y) (+ x y)) #<procedure>)
(proc-src test) ; ==> (lambda* (x y) (+ x y))
(proc-obj test) ; ==> #<procedure>
((proc-obj test) 1 2) ; ==> 3
(test 1 2) ; ==> 3
现在这个解决方案把问题颠倒过来了。由于我没有办法从系统中获取源代码,因此我创建了将源代码与过程对象一起存储的语法,并使用结构特性来打包它们。作为使用 lambda*
的过程与 lambda
的工作方式相同,但内省除外。
我是新来的。马上就要考试了,考试语言方案,我正在准备中
我有一个问题,我花了几个小时尝试解决,但我什至不知道如何开始。
问题是这样的:
有这种形式的新表达式:
(get-procedure-body <exp>)
此表达式接收单个表达式作为参数,对其求值,如果获得用户过程类型值,returns 她body.
方案语言问题
大家好,我是新来的。我马上就要考试了,语言测试,我正在准备中。 我有一个问题,我花了几个小时尝试解决,但我什至不知道如何开始。
问题是这样的: 有这种形式的新表达:
此表达式接收单个表达式作为参数,对其求值,如果获得用户过程类型值,returns 她body.
以下是重估后的可能情况:
- 如果返回值是用户过程 - 必须返回其 body
- 如果返回值是原始过程——“隐藏实现!原始“
- 如果该值不是过程,则打印“procedure-non:错误”
函数运行可能的输出:
(get-procedure-body f)
> ((display x) (* x y))
(get-procedure-body (lambda (x) (h x)) )
> ((h x))
(get-procedure-body +)
> “primitive! Implementation hidden”
(get-procedure-body 1)
> “error: non-procedure”
(get-procedure-body (+ 1 1))
> “error: non-procedure”
问题是这样的:
添加对 body-procedure-get 表达式作为内核表达式的支持(写入所有需要的更改)
如果有人至少能帮助我,我会很高兴,我试着解释自己,如果有什么不清楚的,告诉我,我会解释更多。这对我来说是很难的语言,尤其是因为它没有太多支持。
我什至不知道该怎么办。
获取过程的主体不是 Scheme 的一部分,也不是 Common Lisp 标准,但是如果您制作了支持用户过程的 Scheme 解释器 (eval
),您很可能拥有相关代码在您选择的数据结构中并制作非标准原语 get-procedure-body
将从宿主语言中公开相同的过程。例如。 SICP 这本书确实有一些名字非常相似的东西作为他们的解释器的一部分。
至于使用 Racket,我曾经使它能够做类似的事情:
#lang racket
(struct proc (src obj)
#:property prop:procedure
(struct-field-index obj)
#:transparent
#:methods gen:custom-write
[(define (write-proc x port mode)
((case mode
[(#t) write]
[(#f) display]
[else pretty-print])
(proc-src x)
port))])
(define-syntax lambda*
(syntax-rules ()
((_ . rest)
(proc '(lambda* . rest) (lambda . rest)))))
(define test (lambda* (x y) (+ x y)))
test ; ==> #(struct:closure (lambda* (x y) (+ x y)) #<procedure>)
(proc-src test) ; ==> (lambda* (x y) (+ x y))
(proc-obj test) ; ==> #<procedure>
((proc-obj test) 1 2) ; ==> 3
(test 1 2) ; ==> 3
现在这个解决方案把问题颠倒过来了。由于我没有办法从系统中获取源代码,因此我创建了将源代码与过程对象一起存储的语法,并使用结构特性来打包它们。作为使用 lambda*
的过程与 lambda
的工作方式相同,但内省除外。