【问题标题】:Change literal dynamically in scheme [closed]在方案中动态更改文字[关闭]
【发布时间】:2014-03-22 11:23:29
【问题描述】:

我想写一个接受文字的方法,比如说

turn

end 返回类似的东西

(my turn)

那么,在那之后,如果我调用eval,scheme 将调用带有参数turn 的定义方法my

我确实设法返回了一些其他文字或字符串,但我没有设法做我想做的事。而且我没有找到任何关于这样的规范。

我想我必须以某种方式使用这样的东西:`(my,@param) 但它不起作用。

turn 是一个符号

【问题讨论】:

  • 在Scheme中,my(turn)不是函数应用——正确的做法是(my turn)。另一件事:literal 是什么意思?细绳?多变的?符号?
  • +1 来自@oscar-lopez 的 XY 问题评论。你想解决什么更大的问题?
  • 不是XY问题。我想评估命令列表,并使用我自己的过程处理未定义的文字。
  • 我同意 Óscar 和 John Clements 关于 XY 问题的观点。您为什么要尝试“评估命令列表,并使用 [您的] 自己的过程处理未定义的文字”?很有可能有更好的方法来解决这个问题(原因的答案)。

标签: scheme racket r5rs


【解决方案1】:

听起来像XY problem 对我来说,也许有一种更简单的方法可以实现您真正打算做的事情......无论如何,回答这个问题:

; we need to prevent the evaluation of the parameter,
; a normal procedure won't work here - we need a macro
(define-syntax method
  (syntax-rules ()
    ((_ x) '(my x))))

; sample input
(define turn 9)
(define (my param) (+ 1 param))

; setup the evaluation namespace
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))

; first test: `method` returns a non-evaluated expression
(method turn)
=> '(my turn)

; second test: evaluate the returned expression
(eval (method turn) ns)
=> 10

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多