1

一部の入力が構文チェッカーの引用であるかどうかをチェックできる関数を作成しようとしています。

私は次のコードを持っています:

(define is-quote-expression?
  (lambda (v)
    (equal? (car v) 'quote)
    (is-quotation? (cdr v)))))

(define is-quotation?
  (lambda (v)
    (or (number? v)
        (boolean? v)
        (char? v)
        (string? v)
        (symbol? v)
        (null? v)
        (and (pair? v)
             (is-quotation? (car v))
             (is-quotation? (cdr v)))))

評価しようとすると、次のようになります。

 (is-quote-expression? '1)
 #f

 (is-quote-expression? (cons 'quote 1))
 #t

私のTAは、Scheme環境がすべての「'」を「'quote」に置き換えたと言ったと思いますが、そうではないようです。PetiteChezSchemeを実行しています。

私は何を見ていませんか?

前もって感謝します。

4

3 に答える 3

2

コードにはいくつかの問題があります。最初は、その(lambda (pair? v)部分is-quote-expression?はほぼ間違いなく間違いです(とという2つのパラメーターを使用してラムダを定義していますpair?v

また、ペアでない場合にのみ電話is-quotation?をかけるつもりだったと思いますので、であるかどうかをもう一度尋ねるのは意味がありません。そして、ペアとが両方とも引用である場合にのみ、ペアが引用であると誰が言いましたか?is-quote-expression?v (pair? v)is-quotation?carcdr

ここで、私はこれがあなたが意図したものであると信じています:

(define is-quote-expression?
  (lambda (v)
    (if (pair? v)
        (equal? (car v) 'quote)
        (is-quotation? v))))

(define is-quotation?
  (lambda (v)
    (or (number? v)
        (boolean? v)
        (char? v)
        (string? v)
        (symbol? v)
        (null? v))))
于 2012-05-06T17:56:54.460 に答える
1

私はオスカーの投稿に同意しますが、ペアではなくリストis-quote-expression?を受け入れ、それが引用であったかどうかを返します。

(define is-quote-expression?
  (lambda (v)
    (and (proper-list-of-given-length? v 2)
         (equal? (car v) 'quote)
         (is-quotation? (cadr v)))))

また、あなたの元の質問は、引用が実際に何をするかについていくつかの混乱を示しています。これは実際に起こるべきことです:

> (is-quote-expression? '1)
#f
> (is-quote-expression? (cons 'quote 1))
#f
> (is-quote-expression? (quote 42))
#f
> (is-quote-expression? (quote (quote 42)))
#t

組み込みのquoteプロシージャが、渡されたものを単純に返す方法に注意してください。その場合は(quote 42)単にを返します42。しかし、は、is-quote-expression?に渡したいものを(quote (quote 42))返します。(quote 42)

于 2012-05-06T18:18:20.320 に答える
1

の動作は、 R6RSの付録A.3quoteで指定されています。の場合、関連するルールは6sqvです。'1

(store(sf 1 ...)S 1 [ 'sqv 1 ])→(store(sf 1 ...)S 1 [ sqv 1 ])

これを分解する時が来ました。

「S→T」表記は、用語を評価する1つのステップを定義します。ここで、「S」は「T」と評価されます。

store非終端記号は左側と右側の両方で同じように見えるので、評価方法を理解するためにそれらを理解する必要はありません。何かが必要な場合は、「ストレージ環境」と名前と値のペアとして考えてください。識別子が値に関連付けられ、用語を評価するときに関連付けられることを意味します。sf1 '1storesfn(store ((x 1) (y 2)) S)x1y2S

表記に慣れていない場合は、「穴」が1つある用語(中にaが含まれている用語)を指します。関連する構文要素は2つあります。穴のある用語()と、値で埋められた穴のある用語()です。穴は、名前のない変数のように少し(ただし少しだけ)です。重要な違いの1つは、用語には1つの穴しか許可されないことです。穴はおそらく例によって最もよく説明されます。次のすべては次のとおりです。S[e][]eS[]S[e]S[]

  • (+ [] 1 2)
  • (list [] 'a "foo")
  • (cond ((= x 0) [])
          ((> x 0) 1)
          (else   -1))
    

穴は、サブタームが構文的に有効な場合にのみ表示されることに注意してください。[] 2)穴のある用語ではありません。穴S[0]に置き換えられた用語になります:0

  • (+ 0 1 2)
  • (list 0 'a "foo")
  • (cond ((= x 0) 0)  
          ((> x 0) 1)
          (else   -1))
    

穴に値が指定されている場合、その用語S[]は「コンテキスト」とも呼ばれます。これは、穴のある用語の主な用途の1つである、指定された値を含む任意の用語に一致することから生じます。は、有効なサブ用語として含まれるすべての用語であり、に表示されるコンテキストも同様です。つまり、引用符を含むすべての用語の代用です。S[e]eS[]eS1['sqv1]

  • (+ 'foo 1 2)
  • (list 'bar 'a "foo")
  • (cond ((= x 0) 'baz)
          ((> x 0) 1)
          (else   -1))
    

2番目の用語はquote-termsに2つの異なるコンテキストを提供することに注意してください:(list [] 'a "foo")(list 'bar [] "foo")。これは、穴を名前のない変数であると考えすぎないようにする必要があることを示しています。

なぜコンテキスト用語と穴が使用されるのか疑問に思われる場合は、再帰的定義の代わりになります。コンテキストがない場合、→は用語の構造に対して再帰的に定義する必要があります(Schemeの文法が構造を定義します)。ラムダ計算での置換は、Schemeで定義する可能性のあるツリー処理関数と同様に、構造的再帰の例です(ただし、Schemeの構文は→およびラムダ計算の置換を定義するために使用される構文とはかなり異なります)。

(define (tree-depth tree)
  (if (pair? tree) 
          (max (tree-depth (car tree)) 
               (tree-depth (cdr tree)))
          1
) )

sqv次に、 「自己引用値」の略である、の意味を調べてみましょう。これは、付録A.2に示されているScheme文法の非終端記号です。

sqv :: = n | #t | #f
 n    ::=[数字]

sqvは、単なる数値またはブール値です。

まとめると、6sqv評価ルールは、引用符で囲まれた数値またはブール値が数値またはブール値に評価されることを意味します。見積もりは単に破棄されます。

これが宿題にとって意味することは、関数が呼び出される前にサブタームが評価されるため、通常の関数1との違いがわからないということです。'1マクロが必要です。

'1なぜ「評価する1」とだけ言ってこれらすべてを通過するのですか?まず、「なぜ」と答えるには、「何を」と答えるだけでは不十分です。また、Schemeの正式なセマンティクスの読み方を少し学び、計算理論の概念を味わい、さらに多くの質問につながることで、質問を超えて役立つことを願っています。

于 2012-05-06T20:07:28.763 に答える