Как преобразовать заданные слова в блоке в слова

Я хочу преобразовать блок из block: [ a: 1 b: 2 ] в [a 1 b 2]. Есть ли более простой способ, чем этот?

map-each word block [ either set-word? word [ to-word word ] [ word ] ]


person johnk    schedule 10.05.2013    source источник


Ответы (6)


Все просто:

>> block: [a: 1 b: 2]
== [a: 1 b: 2]
>> forskip block 2 [block/1: to word! block/1]
== b
>> block
== [a 1 b 2]
person DocKimbel    schedule 10.05.2013

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

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 
]
person rebolek    schedule 10.05.2013
comment
Вы должны использовать ANY вместо SOME, также вы должны использовать ключевое слово SKIP вместо ANY-TYPE! - person Ladislav; 10.05.2013

Это создаст новые блоки, но будет довольно лаконичным. Для известных пар 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 тоже довольно лаконичен.

person rgchris    schedule 10.05.2013
comment
Эти collect keep подходы очень элегантны - person johnk; 10.05.2013

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

for i 1 length? block 2 [poke block i to word! pick block i]
person Brett    schedule 10.05.2013

Ответ от Грэма Чиу:

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

>> to block! form [ a: 1 b: 2 c: 3]
== [a 1 b 2 c 3]
person johnk    schedule 10.05.2013
comment
Умное, но... хакерское решение. На струну и обратно? :-/ Я чувствую, что в той проблеме, которую вы изложили, есть своего рода существенная сложность, и решение вашего вопроса как бы соответствует тому, что на диалекте DO. Это просто вопрос на месте или не на месте и т. д. Можете ли вы дать больше контекста того, что вы делаете? - person HostileFork says dont trust SE; 10.05.2013
comment
Контекст пытается преобразовать клиент Twitter rgchris в R3 — reb4.me/r/twitter — в 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!]]
person endo64    schedule 10.05.2013
comment
О, я не видел, что это решение уже предложено. Извини. - person endo64; 10.05.2013