2017-03-18 5 views
5

「という言葉は、スタック上のコンテキストにバインド相対的ではありません」。私はこのエラーを理解することはできません。Ren-Cエラー:;私はRebol3の<a href="https://github.com/metaeducation/ren-c" rel="nofollow noreferrer">experimental Ren-C implementation</a>を使用しています

f: func [x /local y][ 
    emit: func [x] [y] 
    y: 0 
    forall x [emit f []] 
    0 
] 

f [0 0] 

** Script error: y word is bound relative to context not on stack

** Where: emit forall f do catch either either --anonymous-- do trap either --anonymous--

** Near: ... y

コードが悪いのか?

+0

コメントは、拡張された議論のためではありません。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/138621/discussion-on-question-by-giuliolunati-rebol3-ren-c-implementation-error-wor)。 –

+0

また、タグ付けについての議論に[meta]を使用することを検討してください。 –

答えて

6

これはspecific bindingとして知られているものの副産物であり、期待通りに動作しています。

fにFUNCTIONではなくFUNCを使用しているため、emitはfのローカルではありません。 yは、各特定のインスタンスにローカルにあるときにf実行するたびに、あなたは、グローバルemitを上書きしています。

したがって、各呼び出しで上書きされるグローバルemitは、yの概念がもはや存在しないfの呼び出しに関連するemit関数のバージョンを取得するようになります。

あなたは本当にユニークな機能を保持するために、新しいローカルを作成する場合 - Yのユニークなコンセプトで - それが実行されるたび、あなたは明示的にそうすることがあります。

f: func [x /local y emit][ 
    emit: func [x] [y] 
    y: 0 
    forall x [emit f []] 
    0 
] 

f [0 0] 

または暗黙的に:

f: function [x] [ 
    emit: func [x] [y] 
    y: 0 
    forall x [emit f []] 
    0 
] 

f [0 0] 
+0

ご清聴ありがとうございます! – giuliolunati

関連する問題