【问题标题】:add support to new expression scheme language [closed]添加对新表达式方案语言的支持[关闭]
【发布时间】:2021-05-05 03:22:25
【问题描述】:

我是新来的。我很快就会有一个测试,一个测试语言方案,我正在为此做好准备。

我有一个问题想解决几个小时,但我什至不知道如何开始。

问题是这样的:

这种形式有一个新的表达方式:

(get-procedure-body <exp>)

此表达式接收单个表达式作为参数,对其求值,如果获得用户过程类型值,则返回 她的身体。

方案语言中的问题

大家好,我是新来的。我很快就有一个测试,一个测试语言测试,我正在为它做准备。 我有一个问题想解决几个小时,但我什至不知道如何开始。

问题是这样的: 这种形式有一个新的表达方式:

此表达式接收单个表达式作为参数,对其求值,如果获得用户过程类型值,则返回 她的身体。

以下是重估后可能出现的情况:

  • 如果返回值是用户过程 - 必须返回其主体
  • 如果返回值是原始过程 - “隐藏实现!原始“
  • 如果值不是过程,则打印“procedure-non: error”

函数操作的可能输出:

(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 表达式作为内核表达式的支持(编写所有必需的更改)

如果有人至少可以帮助我,我会很高兴,我试图解释自己,如果有不清楚的地方,告诉我,我会解释更多。这对我来说是一种困难的语言,尤其是因为它没有太多的支持。

我什至不知道该怎么做。

【问题讨论】:

  • 听起来好像问题是在特定解释器的上下文中。你有文本的链接吗,在哪里描述?
  • @soegaard 感谢您的帮助,这就是我所拥有的一切
  • 嗯,你在关注什么书/课程资料? SICP? EOPL?或者别的什么。
  • @soegaard book sicp

标签: scheme lisp common-lisp racket sicp


【解决方案1】:

获取过程的主体不是 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 的工作方式相同,但内省除外。

【讨论】:

  • 非常感谢您的帮助,您能告诉我它在 SICP 书中的位置吗?
  • @masterHaham Metacircular evaluatetor。寻找apply和“代表程序”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2023-02-23
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多