2011-03-08 14 views
0

を閉じ括弧を置いが不適切に私は次のスキーム機能持つスキーム機能で

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

を問題は、私はそれを返す必要があり、次のとおりです。

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

端に-the 2つの閉じ括弧は、(n番目の文の後にあるべきである。

これを正しく動作させるにはどうすればいいですか?

がget-アイバーズ呼び出し元:

(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))) 
    )))))))))))) 
+0

ちょっと関係はありませんが、(get-ivars(λ(ivars num)...)) 'を'(define(get-ivars ivars num)...)にすることができれば、 'これは読みやすいのでまた、ここで 'cond'は本当に必要ありません。' if'も同様に動作します。 :) – Mehrdad

+0

待って、どうすれば '(x(n番目のargs1))(y(n番目のargs 2))()'を返すことができますか?それは複数の値を返す!代わりに '((x(n番目のargs1))(y(n番目のargs 2))())'を返すことを意味しましたか? – Mehrdad

+0

@Mehrdad:うん、そういう意味だった。私の悪い! OPで編集。 – jhirsch

答えて

1

あなたelse句の二(list ...)はあなたを台無しに何されていること。これは、それぞれの連続した呼び出しを深く深く入れ子にしています。再帰は自然にリストを作成します。それをもう一度ラップする必要はありません。

試してみてください。

(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の中の割り当てを囲む括弧の余分なセットできます。

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

get-ivars

`(define ClassName 
    (lambda (args) 
    (let ,(get-ivars '(iVar1 iVar2 iVar3) 1) 
     ;; your method-getting code 
    ))) 
のように(あなたがラップたりする必要はありませんので、あなたは、 letでの割り当てのために欲しいものを正確にあるリストのリストを、返却されます私は以前それをスプライスしていた)。独自の引用符を使用すると、結果は次のようになります。

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

これはすべきことです。

ちなみに、私はこのときに遊んでいたときにevalを離れると便利です。結果を視覚的に検査して構文が正常であることを確認することができます。

+0

私は、ここにある「短所」は、私の答えを見て、ネジ止めをすると信じています。しかし、私も間違っている可能性があります...私はどちらかをテストしていない。 – Mehrdad

+0

これは私が欲しいものを返しますが、おそらく私が望むものがわからないかもしれません。私はその値を(let ...)に渡していますが、letは "(x(n番目のargs 1))の不正な構文(識別子ではない)を吐き出します。"あなたが提供した関数は次のようになります:(x(n番目のargs 1))(y(n番目のargs 2))) – jhirsch

+0

@Mehrdad:ああ、そうです。あなたは大丈夫です。私はそれを登録していませんでした。 ''() ''を残したいと思うのは奇妙です。私はちょうど私たちの機能の両方をテストしたところ、彼らは働いています、唯一の違いは最後に ''()です。 –

0

を私はこれを試していないが、私はこれが仕事だと思う:

(define (get-ivars ivars num) 
    (if (null? ivars) 
    '() 
    (list (list (car ivars) `(nth args ,num)) 
      (get-ivars (cdr ivars) (1+ num))))) 
関連する問題