2013-05-10 8 views

risposta

4

Mantenerlo semplice:

>> block: [a: 1 b: 2] 
== [a: 1 b: 2] 
>> forskip block 2 [block/1: to word! block/1] 
== b 
>> block 
== [a 1 b 2] 
0

risposta da Graham Chiu:

In R2 si può fare questo:

>> to block! form [ a: 1 b: 2 c: 3] 
== [a 1 b 2 c 3] 
+0

un intelligente ma ... soluzione hackish. Per stringere e tornare? : -/Mi sembra che ci sia una sorta di [complessità essenziale] (http://en.wikipedia.org/wiki/Essential_complexity) al problema, come hai affermato tu, e la soluzione dal tuo tipo di domanda corrisponde a quella del DO dialetto. È solo un problema di posto contro fuori luogo, ecc. Puoi dare più contesto su quello che stai facendo? – HostileFork

+0

Il contesto sta cercando di convertire il client Twitter di rgchris in R3 - http://reb4.me/r/twitter - nella funzione 'sign' c'è una differenza di comportamento tra r2 e r3 ' params: make oauth any [ params []] param: sort/skip third params 2' (anche dopo che ho sostituito il 'terzo' con' body-of'): -/ – johnk

3

Ho avuto lo stesso problema così ho scritto questa funzione. Forse c'è una soluzione più semplice che non conosco.

flat-body-of: function [ 
    "Change all set-words to words" 
    object [object! map!] 
][ 
    parse body: body-of object [ 
     any [ 
      change [set key set-word! (key: to word! key)] key 
      | skip 
     ] 
    ] 
    body 
] 
+0

Dovresti usare ANY invece di SOME in là, inoltre, dovresti usare la parola chiave SKIP invece di QUALSIASI TIPO! – Ladislav

+0

Grazie per i miglioramenti! – rebolek

2

Questi creano nuovi blocchi, ma sono abbastanza concisi. Per conosciute set-word/value coppie:

collect [foreach [word val] block [keep to word! word keep val]] 

In caso contrario, si può usare 'sia come nel tuo caso:

collect [foreach val block [keep either set-word? val [to word! val][val]]] 

Io suggerirei che il vostro map-each è di per sé abbastanza conciso anche.

+1

Questi approcci 'collect keep' sono molto eleganti – johnk

1

mi piace la risposta di DocKimbel, ma per il bene di un'altra alternativa ...

for i 1 length? block 2 [poke block i to word! pick block i] 
0

o utilizzando PARSE:

block: [ a: 1 b: 2 ] 
parse block [some [m: set-word! (change m to-word first m) any-type!]] 
+0

Oh non ho visto che questa soluzione è già suggerita. Scusate. – endo64