Я хочу преобразовать блок из 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]
У меня была такая же проблема, поэтому я написал эту функцию. Может быть, есть какое-то более простое решение, о котором я не знаю.
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
подходы очень элегантны
- person johnk; 10.05.2013
Мне нравится ответ DocKimbel, но ради другой альтернативы...
for i 1 length? block 2 [poke block i to word! pick block i]
Ответ от Грэма Чиу:
В R2 вы можете сделать это:
>> to block! form [ a: 1 b: 2 c: 3]
== [a 1 b 2 c 3]
sign
здесь есть разница в поведении между r2 и r3 params: make oauth any [params []] params: sort/skip third params 2
(даже после того, как я заменил third
на body-of
) :-/
- person johnk; 10.05.2013
Или с помощью PARSE:
block: [ a: 1 b: 2 ]
parse block [some [m: set-word! (change m to-word first m) any-type!]]