0

目前,我有以下列表:

(define globals '((objects test)))

其变量的名称存储在另一个 alist 中:

(define test '((loc globals) (other properties)))

我想轻松检索全局对象列表。我首先尝试了这段代码。

(assoc 'objects
       (cadr (assoc 'loc
                    test)))

但是,这吐出了一个错误:

错误:在程序关联中:位置 2 中的类型参数错误(期望关联列表):全局变量

我搜索并找到了这个问题,所以我尝试使用 eval。

(assoc 'objects
       (eval '(cadr (assoc 'loc
                           test))
             (interaction-environment)))

但是,这吐出了与上面相同的错误!有谁知道如何用正确的参数调用 assoc ?

编辑(2014-10-27 21:27 EST):感谢您提供的所有解决方案。不幸的是,提交的示例可能不适用于完整代码:

(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"))
4

1 回答 1

1

尝试这个:

(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 在评论中指出的那样)我们可以使用quasiquoting来明确我们确实想要列表中的实际值,而不是我们忘记引用一个项目:

`(loc ,globals)

更新

这是一个不同的问题,你应该从一开始就提到整个上下文。问题中仍然缺少该assoc-set!过程,但是您可以尝试一下,看看它是否是您需要的:

(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)))))))))
于 2014-09-28T01:04:57.637 回答