2013-05-10 3 views

ответ

4

Держа это просто:

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

Ответ от Graham Чиу:

В R2 вы можете сделать это:

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

Умная, но ... хакерское решение. Строка и обратно? : -/Я чувствую, что есть какая-то [существенная сложность] (http://en.wikipedia.org/wiki/Essential_complexity) к проблеме, как вы ее заявили, и решение из вашего вопроса соответствует тому, что в DO диалект. Это просто проблема на месте и вне места и т. Д. Можете ли вы дать больше контекста о том, что вы делаете? – HostileFork

+0

Контекст пытается конвертировать клиент Twitter rgchris в R3 - http://reb4.me/r/twitter - в функции 'sign' есть разница в поведении здесь между r2 и r3 ' params: make oauth any [ params []] params: sort/skip third params 2' (даже после того, как я заменил 'third' на' body-of'): -/ – johnk

3

У меня была такая же проблема, так что я написал эту функцию. Может быть, есть более простое решение, о котором я не знаю.

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

Вы должны использовать ЛЮБОЙ, а НЕ НЕКОТОРЫЙ, кроме того, вы должны использовать ключевое слово SKIP вместо ANY-TYPE! – Ladislav

+0

Спасибо за улучшения! – rebolek

2

Этим были созданы новые блоки, но они были достаточно краткими. Для известных set-word/value пар:

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

В противном случае, вы можете использовать «или как в вашем случае:

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

Я хотел бы предложить, что ваш map-each сам по себе достаточно краткий и.

+1

Эти подходы 'collect keep' очень элегантны – johnk

1

Мне нравится ответ DocKimbel, но ради другой альтернативы ...

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

Или с помощью PARSE:

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

О, я не видел, что это решение уже предложено. Сожалею. – endo64

Смежные вопросы