gpt4 book ai didi

scheme - 方案中代码的部分展开

转载 作者:行者123 更新时间:2023-12-04 18:09:48 25 4
gpt4 key购买 nike

我需要在没有完全评估的情况下部分扩展方案代码。我想要一个采用如下内容的函数:

'(let [(my-number 8)
(my-function (lambda args 'value))]
(cond
((> my-number 10) (my-function 'x 'y 'z))
((= my-number 10) (my-function 'a 'b 'c))
(else my-number)))

然后把它变成这样:

'(cond
((> 8 10) 'value)
((= 8 10) 'value)
(else 8))

换句话说,我想要一些可以扩展定义、lets、letrecs 等而不进行任何危险评估的东西。我打算对一些变化多端的scheme代码做一些静态分析,如果所有的代码都是相对规范化的形式就好了。我想在不冒任何 I/O 风险的情况下进行尽可能多的扩展。

这基本上是编写方案评估程序。我宁愿不。是否有任何方案功能可以帮助我开箱即用?

我应该澄清一下,我无法控制输入。我得到了原样的输入,我必须对其进行分析;我宁愿在进行分析之前对其进行标准化。这就是我要在这里实现的目标。为了让生活更轻松,我不可能手动重写输入。

我正在使用 racket,但不幸的是我的代码必须使用 #lang scheme 运行。

最佳答案

也许 expand是你要找的吗?它不会产生问题中的输出,但它会:

Expand all non-primitive syntax in top-level-form, and return a syntax object for the expanded form that contains only core forms, matching the grammar specified by Fully Expanded Programs

这是一个用法示例:

(define src
'(let [(my-number 8)
(my-function (lambda args 'value))]
(cond
((> my-number 10) (my-function 'x 'y 'z))
((= my-number 10) (my-function 'a 'b 'c))
(else my-number))))

(syntax->datum
(parameterize ([current-namespace (make-base-namespace)])
(expand (datum->syntax #f src))))

有了这个输出:

(let-values (((my-number) '8) ((my-function) (lambda args 'value)))
(if (#%app > my-number '10)
(let-values () (#%app my-function 'x 'y 'z))
(if (#%app = my-number '10)
(let-values () (#%app my-function 'a 'b 'c))
(let-values () my-number))))

请注意,如果我们删除 syntax->datum 转换,expand 返回的值将是 syntax object ,这对于执行您想要的分析可能更有用。

关于scheme - 方案中代码的部分展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17223785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com