2013-05-10 6 views

Odpowiedz

4

ich prostota:

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

odpowiedzi od Graham Chiu:

W R2 można to zrobić:

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

Sprytny ale ... hackish rozwiązanie. Ciągać i powracać? : -/Czuję, że jest jakaś [zasadnicza złożoność] (http://en.wikipedia.org/wiki/Essential_complexity) problemu, jak to określiłeś, a rozwiązanie z twojego rodzaju pytania odpowiada temu w Zrób dialekt. To tylko kwestia miejsca na miejscu a nie na miejscu, itd. Czy możesz podać więcej kontekstu na temat tego, co robisz? – HostileFork

+0

Kontekst próbuje przekonwertować klienta Twittera rgchrisa na R3 - http://reb4.me/r/twitter - w funkcji 'sign' istnieje różnica w zachowaniu pomiędzy parametrami r2 i r3 ' params: make oauth any [ params []] params: sort/skip third params 2' (nawet po tym, jak zastąpiłem 'third' z' body-of'): -/ – johnk

3

miałem ten sam problem więc napisałem tę funkcję. Może jest jakieś prostsze rozwiązanie, którego nie znam.

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

Powinieneś użyć DOWOLNEGO zamiast SOME, również powinieneś użyć słowo kluczowe SKIP zamiast DOWOLNEGO TYPU! – Ladislav

+0

Dzięki za poprawki! – rebolek

2

Stworzyły nowe bloki, ale są dość zwięzłe. Do znanych set-word/value parach:

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

W przeciwnym razie, można użyć „albo jak w przypadku:

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

sugeruję, że map-each sam jest dość zwięzły również.

+1

Te podejścia "zbieraj dalej" są bardzo eleganckie. – johnk

1

Lubię odpowiedź DocKimbel, ale przez wzgląd na innej alternatywy ...

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

lub używając PARSE:

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

Och, nie widziałem, że to rozwiązanie jest już sugerowane. Przepraszam. – endo64