0

私は次のスキーム関数を持っています:

(define get-ivars
  (λ (ivars num)
    (cond ((null? ivars) '())
          (else
           (append (list (car ivars) `(nth args ,num)) (list (get-ivars (cdr ivars) (+ num 1))))))))

これにより、特定のインスタンスで次の結果が返されます。

(x (nth args 1) (y (nth args 2) ()))

問題は、私はそれを返す必要があるということです:

((x (nth args1)) (y (nth args 2)) ())

-最後の2つの閉じ括弧は、(n番目のステートメントの後にある必要があります。

これを正しく機能させるにはどうすればよいですか?

get-ivars呼び出し元:

(define gen-classes
  (λ (classes)
    (cond ((null? classes) '())
          (else
           (let* ((class (car classes)))
             (eval
              `(define ,(cadr class)
                 (λ (args)
                   (let (
                          ,(get-ivars (cdr (cadddr class)) 1)
                          )
                     (eval
                      (let* ,(cdar (cddddr class))
                        (λ (method . args)
                          ,(get-methods (cdadr (cddddr class)))
     ))))))))))))
4

2 に答える 2

1

あなたの条項のその2番目(list ...)はあなたをelse台無しにしているものです。連続する各呼び出しをどんどん深くネストしています。再帰は自然にリストを作成します。もう一度ラップする必要はありません。

試す:

(define get-ivars
  (λ (ivars num)
    (if (null? ivars) '()
      (cons (list (car ivars) `(nth args ,num)) 
            (get-ivars (cdr ivars) (+ num 1))))))

発信者コードに関してはget-ivars、引用符で囲まれていない呼び出しを囲む括弧get-ivarsは、コメントで言及する問題を引き起こしているものです。それらを使用して、このコード:

`(define ClassName
   (lambda (args)
     (let (,(get-ivars '(iVar1 iVar2 iVar3) 1))
       ;; your method-getting code
       )))

あなたにこれを与えます:

(define ClassName
  (lambda (args)
    (let (((iVar1 (nth args 1))
           (iVar2 (nth args 2))
           (iVar3 (nth args 3))))
      ;; method-getting code
     )))

ご覧のとおり、これにより、let内の割り当ての周りに追加の括弧のセットが表示されます。

だからあなたはこれをしたい:

`(define ClassName
   (lambda (args)
     (let ,(get-ivars '(iVar1 iVar2 iVar3) 1)
        ;; your method-getting code
      )))

get-ivarsはリストのリストを返します。これは、の割り当てに必要なものとまったく同じであるため、letラップしたり、(以前に行ったように)スプライスしたりする必要はありません。unquoteを単独で使用すると、結果は次のようになります。

(define ClassName
  (lambda (args)
    (let ((iVar1 (nth args 1))
          (iVar2 (nth args 2))
          (iVar3 (nth args 3)))
      ;; method-getting code
     )))

どちらがうまくいくはずです。

evalちなみに、これで遊んでいたときは省略しておくと便利だと思いました。次に、結果を視覚的に検査して、構文に問題がないことを確認できます。

于 2011-03-08T06:19:15.447 に答える
0

私はこれを試していませんが、これはうまくいくと思います:

(define (get-ivars ivars num)
    (if (null? ivars)
    '()
    (list (list (car ivars) `(nth args ,num))
          (get-ivars (cdr ivars) (1+ num)))))
于 2011-03-08T06:13:14.137 に答える