Domanda

Ho letto internamente i contenitori di memorizzazione R2 come due tabelle, una per le parole e l'altra per i valori, in modo da poterli chiedere:

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

in qualsiasi modo ...

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

Ma c'è un terzo "tavolo" (un blocco) che sembra essere documentato e questo è accessibile solo utilizzando la terza funzione

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

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

Cosa dovrebbe essere questo terzo blocco?

Qualcosa di simile sembra accadere nelle funzioni ma questa volta sia terzo che il piccone esegue bene:

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

Il primo blocco è parammens, il secondo blocco è il corpo ma cosa rappresenta questo terzo blocco in una funzione?

È stato utile?

Soluzione

Hai notato:

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

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

... che è dispari. Sembra in rebol2 che il terzo non è stato puramente sinonimo di scegliere 3, per alcuni casi di bordo. : - /

in rebol3 Questo non è più il caso. Ma ciò che non è più più il caso è che in Rebol3 Positionicking non è disponibile per oggetti o funzioni:

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

Invece hai parole-di, valori di e corpo-of:

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

Questi sono stati retrocessi a Rebol2 in una biblioteca integrata denominata "r2 / avanti", in modo da poter (e dovrebbe) utilizzare queste funzioni al posto di Position Pick.

Hai notato di ottenere risposte simili dal primo e al terzo 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]
.

.

Il primo blocco è parammens, il secondo blocco è il corpo ma cosa rappresenta questo terzo blocco in una funzione?

Il tuo esempio è stato troppo semplice da notare che la distinzione del terzo era che era la specifica, perché le tue specifiche contenevano solo parole. Quindi specifiche era uguale alle parole di. Aggiungere un vincolo di tipo alle tue specifiche rivela la differenza.

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

>> first :f
== [a]

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

Ancora una volta, Rebol2 Via R2 / Inoltra offre parole-di, specifiche e corpo-of per funzioni. E ancora una volta, evitare l'uso di scelte posizionali per queste proprietà.

Altri suggerimenti

Third restituisce la definizione dell'oggetto.

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

è uguale a body-of in rebol 2.7.7 e superiore e rebol 3.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top