¿Cuál es el bloque indocumentado que obtiene de la tercera en objeto / función en Rebol2?

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

  •  21-12-2019
  •  | 
  •  

Pregunta

He leído los contextos de las tiendas internamente R2 como dos tablas, una para las palabras y la otra para valores, para que pueda solicitarlos:

o: context [a: 1 b: 2]
>> first o
== [self a b]
>> second o
== [make object! [
        a: 1
        b: 2
    ] 1 2]

de cualquier manera ...

>> pick o 1
== [self a b]
>> pick o 2
== [make object! [
        a: 1
        b: 2
    ] 1 2]

Pero hay una tercera mesa "(un bloque) que parece estar indocumentado y este es solo accesible usando la tercera función

>> third o
== [a: 1 b: 2]

>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3

¿Qué se supone que es este tercer bloque?

Algo similar parece ocurrir en funciones, pero esta vez tanto la tercera como la selección de buen desempeño:

>> 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]

El primer bloque es Params, el segundo bloque es el cuerpo, pero ¿qué representa este tercer bloque representa en una función?

¿Fue útil?

Solución

Noticias:

>> third o
== [a: 1 b: 2]

>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3

... que es extraño. Parece en Rebol2 que el tercero no era puramente sinónimo de selección de 3, para algunos casos de borde. : - /

en rebol3 Este ya no es el caso. Pero lo que tampoco es más largo, el caso es que en la selección posicional REBOL3 no está disponible para objetos o funciones:

>> pick object [a: 1 b: 2] 1
** Script error: pick does not allow object! for its aggregate argument

En su lugar, tiene palabras, valores, y cuerpo 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
]

Estos han sido respaldados a Rebol2 en una biblioteca incorporada llamada "R2 / Forward", por lo que puede (y debe) utilizar estas funciones en lugar de la selección posicional.

Notó obtener respuestas similares de primera y tercera con:

>> 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]

El primer bloque es Params, el segundo bloque es el cuerpo, pero ¿qué representa este tercer bloque representa en una función?

Tu ejemplo era demasiado simple para notar que la distinción del tercero era que era la TPN, porque tu especificación solo contenía palabras. Así que la especificación fue igual a las palabras, de. Agregar una restricción de tipo a su especificación revela la diferencia.

>> f: func [a [integer!]] [print a]

>> first :f
== [a]

>> third :f
== [a [integer!]]

Una vez más, Rebol2 a través de R2 / Forward le ofrece palabras, específicas y más corporales para funciones. Y una vez más, evite usar selecciones posicionales para estas propiedades.

Otros consejos

Third devuelve la definición de objeto.

>> body: [a: 1 b: 2]
== [a: 1 b: 2]
>> obj: context body
>> equal? body third obj
== true
>> strict-equal? body third obj
== true

Es igual que body-of en Rebol 2.7.7 y superior y Rebol 3.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top