2013-05-10 2 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

답변 :

는 R2에서이 작업을 수행 할 수 있습니다 : 나는이 같은 문제가 없었다

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

영리한하지만, ... 해킹 된 솔루션. 문자열로 돌아가려면? :// 당신이 그것을 명시한 것처럼 문제에 대한 [필수 복잡성] (http://en.wikipedia.org/wiki/Essential_complexity)이있는 것 같고 질문 종류의 솔루션이 사투리. 그것은 단지 자리를 비 웠을 때의 문제 일뿐입니다. 당신이하고있는 일에 대해 더 이상의 상황을 줄 수 있습니까? – HostileFork

+0

컨텍스트가 rgchris의 트위터 클라이언트를 R3으로 변환하려고합니다. - http://reb4.me/r/twitter - 'sign' 함수에서 r2와 r3 사이의 동작에 차이가 있습니다. 'params : make oauth any [ params []] params : 세 번째 매개 변수를 정렬/건너 뛰기 ('third-body '를 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

거기에 SOME 대신 ANY를 사용해야하며, ANY-TYPE 대신 SKIP 키워드! – 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