Qual é o bloco não documentado que você obtém do THIRD no objeto/função no Rebol2?
Pergunta
Eu li internamente que o R2 armazena contextos como duas tabelas, uma para palavras e outra para valores, então você pode solicitá-los:
o: context [a: 1 b: 2]
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]
de qualquer forma...
>> pick o 1
== [self a b]
>> pick o 2
== [make object! [
a: 1
b: 2
] 1 2]
mas há uma terceira "tabela" (um bloco) que parece não estar documentada e esta só é acessível usando a terceira função
>> third o
== [a: 1 b: 2]
>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3
o que deveria ser esse terceiro bloco?
algo semelhante parece ocorrer em funções, mas desta vez tanto a terceira quanto a escolha funcionam bem:
>> f: func [a] [print a]
>> first :f
== [a]
>> second :f
== [print a]
>> third :f
== [a]
>> pick :f 1
== [a]
>> pick :f 2
== [print a]
>> pick :f 3
== [a]
o primeiro bloco é params, o segundo bloco é body, mas o que esse terceiro bloco representa em uma função?
Solução
Você percebeu:
>> third o
== [a: 1 b: 2]
>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3
...o que é estranho.Parece em Rebol2 que THIRD não era puramente sinônimo de PICK de 3, para alguns casos extremos.:-/
No Rebol3 este não é mais o caso.Mas o que também não acontece mais é que no Rebol3 a seleção posicional não está disponível para objetos ou funções:
>> pick object [a: 1 b: 2] 1
** Script error: pick does not allow object! for its aggregate argument
Em vez disso, você tem PALAVRAS-DE, VALORES-DE e CORPO-DE:
>> words-of object [a: 1 b: 2]
== [a b]
>> values-of object [a: 1 b: 2]
== [1 2]
>> body-of object [a: 1 b: 2]
== [
a: 1
b: 2
]
Eles foram portados para o Rebol2 em uma biblioteca integrada chamada "R2/Forward", então você pode (e deve) usar essas funções no lugar da seleção posicional.
Você notou respostas semelhantes de FIRST e THIRD com:
>> f: func [a] [print a]
>> first :f
== [a]
>> second :f
== [print a]
>> third :f
== [a]
>> pick :f 1
== [a]
>> pick :f 2
== [print a]
>> pick :f 3
== [a]
o primeiro bloco é params, o segundo bloco é body, mas o que esse terceiro bloco representa em uma função?
Seu exemplo foi simples demais para perceber que o diferencial do terceiro era que era o SPEC-OF, pois seu spec continha apenas palavras.Então SPEC-OF era igual a WORDS-OF.Adicionar uma restrição de tipo às suas especificações revela a diferença.
>> f: func [a [integer!]] [print a]
>> first :f
== [a]
>> third :f
== [a [integer!]]
Mais uma vez, Rebol2 via R2/Forward oferece WORDS-OF, SPEC-OF e BODY-OF para funções.E mais uma vez, evite usar escolhas posicionais para essas propriedades.
Outras dicas
Third
retorna a definição do objeto.
>> body: [a: 1 b: 2]
== [a: 1 b: 2]
>> obj: context body
>> equal? body third obj
== true
>> strict-equal? body third obj
== true
É o mesmo que body-of
no Rebol 2.7.7 e superior e no Rebol 3.