2016-05-25 9 views
7

Utilizzando il REBOL/View 2.7.8 Core, vorrei preparare in anticipo un layout vista assegnando automaticamente parole a vari elementi del layout, come nell'esempio seguente. Invece diLayout REBOL: come creare automaticamente parole di layout - la parola non ha contesto?

prepared-view: [across 
       cb1: check 
       label "Checkbox 1" 
       cb2: check 
       label "Checkbox 2" 
       cb3: check 
       label "Checkbox 3" 
       cb4: check 
       label "Checkbox 4" 
       ] 
    view layout prepared-view 

avrei così come le parole cb1 thru cb5 da creare automaticamente, ad esempio:

prepared-view2: [ across ] 
    for i 1 4 1 [ 
     cbi: join "cb" i 
     cbi: join cbi ":" 
     cbi: join cbi " check" 
     append prepared-view2 to-block cbi 
     append prepared-view2 [ 
     label ] 
     append prepared-view2 to-string join "Checkbox " i 
     ] 
    view layout prepared-view2 

Tuttavia, mentre difference prepared-view prepared-view2 spettacoli non differenze nel blocco essendo analizzati (== []) , il secondo script porta a un errore:

** Script Error: cb1 word has no context 
    ** Where: forever 
    ** Near: new/var: bind to-word :var :var 

Ho passato ore a cercare di capire perché, e penso che in qualche modo le nuove parole debbano essere legate al contesto specifico, ma non ho ancora trovato alcuna soluzione al problema.

Cosa devo fare?

risposta

2
bind prepared-view2 'view 
view layout prepared-view2 

crea le associazioni corrette.

Ed ecco un altro modo per creare dinamicamente layout

>> l: [ across ] 
== [across] 
>> append l to-set-word 'check 
== [across check:] 
>> append l 'check 
== [across check: check] 
>> append l "test" 
== [across check: check "test"] 
>> view layout l 

E quindi è possibile utilizzare i loop per creare diverse variabili da aggiungere al layout.

+0

Sì, questo aiuta molto, grazie! –

2

Quando si utilizza TO-BLOCK per convertire una stringa in un blocco, si tratta di un'operazione di basso livello che non passa attraverso il binding "normale" a contesti "predefiniti". Tutte parole saranno non legato:

>> x: 10  
== 10 

>> code: to-block "print [x]" 
== [print [x]] 

>> do code 
** Script Error: print word has no context 
** Where: halt-view 
** Near: print [x] 

Quindi, quando si vuole costruire il codice da stringhe prime in fase di esecuzione le cui ricerche funzionerà, una possibilità è quella di utilizzare LOAD e farà qualcosa di default-ish, e che potrebbe funzionare per po 'di codice (il caricatore è come gli attacchi sono stati fatti per il codice che sta eseguendo che provenivano da fonte):

>> x: 10 
== 10 

>> code: load "print [x]" 
== [print [x]] 

>> do code 
10 

oppure si può nominare i contesti/oggetti in modo esplicito (o per mezzo di una parola esemplare legato in quel contesto) e utilizzare BIND.

+0

... quindi cambio semplicemente 'append prepared-view2 to-block cbi' a' append prepared-view2 load cbi' ... sì, funziona! –