Я хочу преобразовать блок из block: [ a: 1 b: 2 ]
в [a 1 b 2]
. Есть ли более простой способ, чем это?Как преобразовать заданные слова в блок в слова
map-each word block [ either set-word? word [ to-word word ] [ word ] ]
Я хочу преобразовать блок из block: [ a: 1 b: 2 ]
в [a 1 b 2]
. Есть ли более простой способ, чем это?Как преобразовать заданные слова в блок в слова
map-each word block [ either set-word? word [ to-word word ] [ word ] ]
Держа это просто:
>> block: [a: 1 b: 2]
== [a: 1 b: 2]
>> forskip block 2 [block/1: to word! block/1]
== b
>> block
== [a 1 b 2]
Ответ от Graham Чиу:
В R2 вы можете сделать это:
>> to block! form [ a: 1 b: 2 c: 3]
== [a 1 b 2 c 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
]
Этим были созданы новые блоки, но они были достаточно краткими. Для известных 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
сам по себе достаточно краткий и.
Эти подходы 'collect keep' очень элегантны – johnk
Мне нравится ответ DocKimbel, но ради другой альтернативы ...
for i 1 length? block 2 [poke block i to word! pick block i]
Или с помощью PARSE:
block: [ a: 1 b: 2 ]
parse block [some [m: set-word! (change m to-word first m) any-type!]]
О, я не видел, что это решение уже предложено. Сожалею. – endo64
Умная, но ... хакерское решение. Строка и обратно? : -/Я чувствую, что есть какая-то [существенная сложность] (http://en.wikipedia.org/wiki/Essential_complexity) к проблеме, как вы ее заявили, и решение из вашего вопроса соответствует тому, что в DO диалект. Это просто проблема на месте и вне места и т. Д. Можете ли вы дать больше контекста о том, что вы делаете? – HostileFork
Контекст пытается конвертировать клиент 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