2013-05-06 4 views
3

При использовании parse для извлечения значений из данных я часто в конечном итоге объявляю глобалы для записи данных copy. Например,Сведение к минимуму загрязнения пространства имен при копировании данных с помощью синтаксического анализа

numbers: none 
rule: [ thru 5 copy numbers to 10 to end ] 
parse [ 1 2 3 4 5 6 7 8 9 10 ] [ rule ] 

Что бы лучший способ сделать это без использования numbers как глобальный? Должен ли я определить context для обертки всей партии или есть более элегантное решение?

ответ

2

Контекст не будет работать без объявления переменных в контексте

>> unset 'a 
>> context [ parse "aa" [ copy a to end ]] 
>> a 
== "aa" 

Таким же образом вы можете использовать свои правила синтаксического анализа внутри функции с переменными, объявленными как местные, чтобы остановить их загрязнять глобальное имя пространство.

6

С точки зрения R2. Да, обертывание всей партии в контексте (с использованием CONTEXT) прямолинейно. Вы также можете сделать это с помощью USE:

 
use [numbers][ 
    numbers: none 
    rule: [ thru 5 copy numbers to 10 to end ] 
    parse [ 1 2 3 4 5 6 7 8 9 10 ] [ rule ] 
] 

И, как говорит Грэм, использовать локальную переменную функцию, которая будет устанавливать ЧИСЛА никому по умолчанию.

Я часто использую ИСПОЛЬЗОВАНИЕ, чтобы передать себе, что контекст является временным, или создать частный контекст.

+0

В этом случае нет необходимости в «номерах: нет», как это необходимо, если вы используете CONTEXT. – endo64

+1

Endo yes that is true, если правило преуспевает, как этот пример, но скажите, что мой пример содержит только первые 4 числа, и у меня не было «чисел: нет», тогда числа не имели бы значения, то есть он был бы неустановлен !, который является поведением по умолчанию с USE в Rebol 2. Это может потребоваться или не хотеть, чтобы вы захотели. ИСПОЛЬЗОВАНИЕ в Rebol 3 имеет другое поведение и автоматически устанавливает номера в none. – Brett

+0

Спасибо, Брет, я не знал, что ИСПОЛЬЗОВАНИЕ ведет себя по-другому в R3. – endo64

 Смежные вопросы

  • Нет связанных вопросов^_^