Я совершенно уверен, что вы могли бы достичь своей цели более чистым способом, чем этот.В любом случае, я могу сказать вам, почему то, что вы делаете, не работает!
Ваше n
- это выражение length? block-fields
, и ваш цикл repeat
увеличивается до n
.Но block-fields
содержит единственный параметр [property]
!Следовательно, он переходит от 1 к 1.
Вы предположительно хотели проверить что-то перечисляющее по block-values
(в этом примере диапазон от 1 до 3) и затем обрабатывать это однозначно, еслииндекс достиг 3. Иными словами, ваше выражение set in self 'EOB
должно быть частью вашего перечисления по block-values
, а НЕ block-fields
.
Это дало бы вам желаемое поведение:
n: length? block-values
i: 1
foreach :block-fields block-values compose/only [
set in self 'EOB equal? i n
do (actions)
++ i
]
Это абсолютно не сработает:
append actions compose/only [
set in self 'EOB (i = n)
set in system/words (to-lit-word pick (block-fields) (i)) get pick (block-fields) (i)
]
... потому что вы сталкиваетесь с ситуацией, когда i
и n
оба равны 1, для одной итерации этогопетля.Что значит (i = n)
верно.Таким образом, метакод, который вы получаете для «действий», выглядит следующим образом:
[
set in self 'EOB true
set in system/words 'property get pick [property] 1
]
Затем вы запускаете код с избыточной композицией (поскольку нет PAREN! S, вы можете просто опустить COMPOSE / ONLY):
append actions compose/only [
append out build-markup content
]
, который добавляет строку в ваш actions
метакод, очевидно:
[
set in self 'EOB true
set in system/words 'property get pick [property] 1
append out build-markup content
]
Как обычно, я предлагаю вам научиться использовать PROBE и PRINT для просмотра ипроверьте свои ожидания на каждом этапе.Rebol хорош в сбросе переменных и тому подобного ...