Scheme 在Guile方案中设置具有动态计算变量名的列表
目前,我有以下情况:Scheme 在Guile方案中设置具有动态计算变量名的列表,scheme,eval,guile,Scheme,Eval,Guile,目前,我有以下情况: (define globals '((objects test))) 其变量的名称存储在另一个列表中: (define test '((loc globals) (other properties))) 我想在globals中轻松检索对象列表。我首先尝试了这个代码 (assoc 'objects (cadr (assoc 'loc test))) 但是,这会产生一个错误: 错误:在过程assoc中:位置2的类型参数
(define globals '((objects test)))
其变量的名称存储在另一个列表中:
(define test '((loc globals) (other properties)))
我想在globals中轻松检索对象列表。我首先尝试了这个代码
(assoc 'objects
(cadr (assoc 'loc
test)))
但是,这会产生一个错误:
错误:在过程assoc中:位置2的类型参数错误(应为关联列表):全局
我搜索并找到了,所以我尝试使用eval
(assoc 'objects
(eval '(cadr (assoc 'loc
test))
(interaction-environment)))
但是,这会产生与上面相同的错误!有人知道如何用正确的参数调用assoc吗
编辑(美国东部时间2014-10-27 21:27):感谢您提供的所有解决方案。不幸的是,提交的示例可能无法处理完整的代码:
(define-syntax object
(syntax-rules ()
((_ name prop prop* ...)
(begin
(define name '(prop prop* ...))
(let* ((parent (cadr (assoc 'loc name)))
(objref (cdr (assoc 'objects parent))))
(set! parent
(assoc-set! parent
'objects
(append objref '(name)))))))))
(object my-object
(loc globals)
(name "Harry")
(desc "My Object"))
试试这个:
(define globals '((objects test)))
(define test (list (list 'loc globals) '(other properties)))
; alternatively: (define test (list `(loc ,globals) '(other properties)))
(assoc 'objects
(cadr (assoc 'loc test)))
=> '(objects test)
在这种情况下,我们不希望创建这样的符号列表:
'(loc globals)
我们想要的是一个列表,其第二个元素是另一个名为globals
的列表:
(list 'loc globals)
或者(正如Chris在评论中指出的那样),我们可以使用来明确表示我们确实希望列表中有一个实际值,而不是我们忘记引用一个项目:
`(loc ,globals)
更新
这是一个不同的问题,你应该从一开始就提到整个上下文。assoc集合问题中仍然缺少代码>过程,但您可以尝试以下操作,以查看它是否符合您的需要:
(define-syntax object
(syntax-rules ()
((_ name prop prop* ...)
(begin
(define name '(prop prop* ...))
(let* ((parent (eval (cadr (assoc 'loc name)))) ; use Guile's eval
(objref (cdr (assoc 'objects parent))))
(set! parent
(assoc-set! parent
'objects
(append objref '(name)))))))))
实际上,我更喜欢在这种情况下使用准旋转(`(loc,globals)
)。这样一来,很明显什么东西没有被引用(而不是“哦,只是我在使用列表时忘记引用的东西”)。我不确定这是否适用于完整的代码,因为它使用语法规则,需要一个任意的输入列表。有什么方法可以让我轻松地重写输入列表吗?@Elzair请检查我的更新答案。还要注意,整个语法规则将返回一个void值,因为执行的最后一个表达式是set代码>,它更新本地绑定。我不知道您试图实施的具体内容,但似乎是重新考虑您的方法的好时机……这看起来像是感谢您的帮助和建议。我用更多的上下文更新了这个问题。@ÓscarLópez我试图实现一个IF开发系统,类似于我试图用以下代码轻松定义一个房间(或对象):(房间客厅(loc rooms)(desc“客厅”)(厨房以东)…)