gpt4 book ai didi

algorithm - 解析并定义文字

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:00:37 26 4
gpt4 key购买 nike

我有一个用这个方法定义的文字:

  (define right-hand-rule-prg
'(
(procedure start
( turn-right
(if wall?
( turn-left
(if wall?
(turn-left
(if wall?
turn-left
step
)
)
step
)
)
step
)
put-mark
start
)
)
(procedure turn-right (turn-left turn-left turn-left turn-left turn-left))
)
)

而且我必须解析和定义过程 startturn-right

我设法使用这个方法通过名称获取过程:

(define (get-procedure procedure program)
(if (null? program)
'(procedure-not-found)
(if (eq? procedure (cadar program))
(caddar program)
(get-procedure procedure (cdr program))
)
)
)

所以在调用之后我得到:

(get-procedure 'turn-right right-hand-rule-prg)
'(turn-left turn-left turn-left turn-left turn-left)

但不知何故我必须设法找到所有过程名称并像这样定义这个过程:

(define (name-of-procedure) (get-procedure name-of-procedure-program))

我该怎么做?

最佳答案

我不确定我是否理解动机/背景,以及您在这里尝试做的事情。但是您勾勒出的内容似乎是“违背常理”。

在 Scheme 和 Racket 中,函数是一流的对象——您可以将它们放在列表中,传递它们等等。它会更简单,并且“切颗粒”来翻转它:像往常一样定义函数,并使 right-hand-rule-prg 成为 函数列表

(define (turn-left)
...)

(define (turn-right)
...)

(define (start)
...)

(define right-hand-rule-prg
(list start turn-right))

要执行 right-hand-rule-prg,您可以执行类似以下的操作来运行列表中的过程:

(for ([f (in-list right-hand-rule-prg)])
(f))

请注意,right-hand-rule-prg 之类的东西是一个可以在运行时构建或修改的列表。所以你可以让例如用户修改它,或从文件中读取它。然而,构建 block ——像 startturn-right 这样的原语——通常是定义的函数。

如果您确实需要在运行时定义基元,您可以在用户提供的 s 表达式上使用 eval。但这是最不可取的选择。你应该尽量避免 eval。如果您希望用户在运行时贡献任意 Racket 函数,最好使用类似 dynamic-require 的东西。或者甚至更好,反转控制——您的代码是用户程序的库(而不是您的代码在运行时利用用户的代码)。

关于algorithm - 解析并定义文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22427971/

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