0

現在、私は次のalistを持っています:

(define globals '((objects test)))

その変数の名前は、別の連想リストに格納されます。

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

グローバルのオブジェクト リストを簡単に取得したいと考えています。私は最初にこのコードを試しました。

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

ただし、それはエラーを吐き出します:

エラー: プロシージャ assoc 内: 位置 2 の型引数が間違っています (関連リストが必要です): globals

この質問を検索して見つけたので、 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)

必要なのは、2 番目の要素が という別のリストであるリストです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 に答える