Qual é o bloco não documentado que você obtém do THIRD no objeto/função no Rebol2?

StackOverflow https://stackoverflow.com//questions/22053821

  •  21-12-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top