Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 在Guile方案中设置具有动态计算变量名的列表_Scheme_Eval_Guile - Fatal编程技术网

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“客厅”)(厨房以东)…)