2012-01-22 7 views
3

リンクhttp://www.ccs.neu.edu/home/ryanc/macro-stepper/tutorial.htmlにはマクロステッパーの操作方法が記載されています。DrRacketのマクロステッパー

しかし、私が試してみると、ゼロ以外の定義でmyorの2番目の拡張を得ることができませんか?機能、最初のもののみ。また、「前期」と「次期」というボタンはありません。

私の質問は次のとおりです。チュートリアルのように、マクロステッパーを2番目の展開に設定する必要がありますか?

+0

#racket freenode ircチャンネルをお試しください。この種の質問は、StackOverflowが実際には提供しない前後の会話の恩恵を受けるでしょう。 –

+0

ええダン、私はそれを知っています。しかし残念ながら私はラケットユーザーグループから禁止されているので、私はそこで質問することはできません(Shriram Krishnamurthiは私のWebフレームワークを批判しているので私を嫌っています)。 –

+0

@Greg H:はい、私は非常にdyooに感謝し、私は彼の答えをupvotingで表現しました。私は彼の答えを受け入れたとマークする方法を知らない(そのボタンを見つけることができなかった) –

答えて

6

私はあなたのソースプログラムは、このような何かを見ていると仮定しています:

#lang racket 
(define-syntax myor 
    (syntax-rules() 
    [(myor e) e] 
    [(myor e1 . es) 
    (let ([r e1]) (if r r (myor . es)))])) 
(define (nonzero? r) 
    (myor (negative? r) 
     (positive? r))) 

短編小説:構文-場合ではなく、構文規則瞬間のためを使用します。マクロステッパーと構文ルールに関連するバグがあるようです。私はbug reportに沿ってラケット開発者に送ったので、うまくいけばこれは間もなく修正される予定です。上記のプログラムの構文ケースのバージョンは次のようになります。以下は

#lang racket 

(define-syntax (myor stx) 
    (syntax-case stx() 
    [(_ e) #'e] 
    [(_ e1 . es) 
    #'(let ([r e1]) (if r r (myor . es)))])) 

(define (nonzero? r) 
    (myor (negative? r) 
     (positive? r))) 

私は5.2.1のプレリリースの下で、あなたのプログラムを実行すると、私はマクロ隠れセットで、マクロステッパーで以下を参照してください長い物語...

です「標準」に:

(module anonymous-module racket 
    (#%module-begin 
    (define-syntax myor 
    (syntax-rules() [(myor e) e] [(myor e1 . es) (let ([r e1]) (if r r (myor . es)))])) 
    (define (nonzero? r) 
    (let:26 ([r:26 (negative? r)]) (if:26 r:26 r:26 (myor:26 (positive? r))))))) 

これは間違っています。 myorを1つだけ使用してとすると、になります。非常に奇妙な!

ああ

(module anonymous-module racket 
    (#%module-begin 
    (define-syntax myor 
    (syntax-rules() [(myor e) e] [(myor e1 . es) (let ([r e1]) (if r r (myor . es)))])) 
    (define (nonzero? r) (let ([r (negative? r)]) (if r r (myor (positive? r))))))) 

...さんはラケット5.2の下でどのように見えるか、物事を見てみましょう。さて、私はあなたがRacket 5.2で見たのと同じ問題、そしてプレリリース版を見ることができます。

バグは、「マクロ隠蔽」機能の動作に関連しているように見えます。この機能は、標準に設定されているときに完全拡張であなたを圧倒しないようにします。あなたはそれが「無効」に設定する場合は、マクロデバッガがその完全な、ありのままの栄光に拡大表示されますことがわかります、そしてそれは我々が見ることを期待拡張などが行われます。

(module anonymous-module racket 
    (#%module-begin 
    (define-syntaxes (myor) 
    (lambda (x) 
     ; ... I'm omitting the content here: it's way too long. 
    )) 
    (define-values:20 (nonzero?) 
    (lambda:21 (r) (let-values:22 (((r) (#%app:23 negative? r))) (if r r (#%app:24 positive? r))))))) 

I'LLをbug reportと書いてラケット開発者に送ってください。

構文規則とは対照的に、あなたは、構文-ケースを使用してマクロを記述する場合、マクロステッパーとのより良い仕事に表示されます。

#lang racket 

(define-syntax (myor stx) 
    (syntax-case stx() 
    [(_ e) #'e] 
    [(_ e1 . es) 
    #'(let ([r e1]) (if r r (myor . es)))])) 

(define (nonzero? r) 
    (myor (negative? r) 
     (positive? r))) 

これを実行すると、より効果的なようです。このバグを引き起こしているものは何でも、マクロステッパーとのやりとりや、の構文規則のようです。ですので、代わりにの構文ケースを使用してみてください。

+0

ありがとう、Danny。私はあなたの努力に本当に感謝しています! –

+1

Cool。回答が受け入れ可能な場合は、この質問を回答としてマークし、SOの「未回答」リストから外します。 – dyoo

1

これは私のために何も追加することなく動作しました。最新バージョンのRacketで試してみて、メニューから別の言語を選択して、選択した言語にdebuggingが選択されていることを確認してください。

+1

Windows 7でDrRacket 5.2を実行していますが、言語は#lang racketです。ここでのスクリーンショットは次のとおりです。http://www.uploadscreenshot.com/image/705182/3970725 –

+1

@RacketNoob:モジュールの展開とマクロ展開ではありません。 – leppie

+0

申し訳ありませんが、私はmyorの2番目の展開を取得できません(最初のクリックがグレー表示された後の "Step - >"ボタン)。誰かが詳細なステップごとの指示をどのようにマクロ展開ステップを最後まで行うことができますか? –

関連する問題