Почему разница в использовании между «clear» и «unset» в списках Rebol? - PullRequest
2 голосов
/ 24 июля 2010

С учетом списка:

a: [1 2 3 4 5]

Почему clear a очищает список и unset 'a сбрасывает его? Я бы ожидал, что и clear, и unset будут последовательно принимать либо a, либо 'a в качестве аргументов.

Ответы [ 2 ]

3 голосов
/ 24 июля 2010

Очистить удаляет записи из блока, на который ссылается слово a :

a: [1 2 3 4 5]
length? a
== 5
clear a
length? a
== 0

Unset удаляет слово a сам:

a: [1 2 3 4 5]
length? a
== 5
unset 'a
length? a
** Script Error: a has no value
** Near: length? a
0 голосов
/ 25 июля 2010

UNSET - это операция, которая принимает значение типа WORD!и CLEAR - это операция, которая принимает значение типа SERIES!Обратите внимание, что несколько слов могут указывать на одну и ту же серию!значение ...

>> a: [m a t t]
== [m a t t]

>> b: a
== [m a t t]

>> clear a
== []

>> b
== []

С момента передачи СЛОВА!Операция серии не имеет смысла в настоящее время, технически возможно, что CLEAR может выбрать распознавание, когда вы передадите ей СЛОВО!значение и сделайте что-то особенное в этом случае (например, найдите значение, связанное с этим словом - если оно есть) и удалите его значения).Но «косвенно косвенное слово, если нет другого значения» не является особенно хорошим инвариантом, и вы не найдете его в таких операциях, как FIRST или FIND и т. Д.

Обратный случай ... иметьunset QUOTE его аргумент неявно ... будет технически возможно.Но если бы это было так, как бы вы справились со случаем, когда СЛОВО!чтобы unset хранился в другом СЛОВЕ?

>> c: [m a t t]
== [m a t t]

>> d: 'c
== c

>> unset d

>> c
** Script error: c has no value

>> d
== c

>> unset 'd

>> d
** Script error: d has no value
...