В чем разница между встроенной функцией FUNCTION и надстройкой FUNCS?

В Rebol 3 есть новая реализация FUNCTION, которая позволяет автоматически связывать переменные с локальный контекст по умолчанию.

У FUNCTION проблема со значением VALUE? test, поскольку он возвращает TRUE, даже если переменная еще не была установлена ​​во время выполнения:

foo: function [] [
    if value? 'bar [
        print [{Before assignment, bar has a value, and it is} bar]
    ]

    bar: 10

    if value? 'bar [
        print [{After assignment, bar has a value, and it is} bar]
    ]
]

Если вы позвоните в FOO, вы получите:

Before assignment, bar has a value, and it is none
After assignment, bar has a value, and it is 10

FUNC работает не так (он говорит только о том, что BAR имеет значение после присваивания). Но тогда FUNC не делает переменные автоматически локальными.

Я нашел примитив FUNCS здесь, в библиотеке, созданной Ладиславом Мечиром. Чем он отличается, и есть ли у него такие же недостатки?

http://www.fm.vslib.cz/~ladislav/rebol/funcs.r


person Rebol Tutorial    schedule 17.07.2010    source источник
comment
По мере того, как вы узнаете немного больше о Rebol и scoping, вы можете еще раз взглянуть на Rubol, например, на этот тест: github.com/hostilefork/rubol/blob/master/scope-test.r   -  person HostileFork says dont trust SE    schedule 18.07.2010
comment
Я 10 раз перечитал ладислава биндологию и даже не все понял, думаю, с твоей будет так же, но постараюсь;)   -  person Rebol Tutorial    schedule 19.07.2010


Ответы (1)


Основное отличие состоит в том, что FUNCTION выполняет глубокий поиск заданных слов в теле, тогда как FUNCS выполняет их поверхностный поиск. FUNCS также использует немного другую спецификацию.

FUNCS существует уже довольно давно (правда, недавно произошло изменение названия).

ЭТО ЗНАЧЕНИЕ? "проблема" функции связана с тем, что локальные переменные функций (даже если вы используете FUNC с / LOCAL для их явного объявления) инициализируются значением NONE. Что вызывает ЗНАЧЕНИЕ? функция возвращает значение ИСТИНА, даже если переменные «еще не инициализированы».

Как правило, я не считаю, что "инициализация NONE" представляет собой "большое дело", хотя это поведение не совпадает с поведением глобальных или объектных переменных.

person Ladislav    schedule 17.07.2010
comment
Для меня это очень важно, потому что я часто хочу протестировать необязательные параметры. Уточнение не всегда удобно для пользователя, я предпочитаю игнорировать параметры. - person Rebol Tutorial; 19.07.2010
comment
Я все еще не уверен, что вы понимаете ЗНАЧЕНИЕ? проблема. Я написал пример кода, предполагая, что вы запустите его, чтобы узнать, о чем он. - person Ladislav; 20.07.2010
comment
По поводу тестирования необязательных параметров: все равно возможно. - person Ladislav; 20.07.2010