2011-01-20 3 views
3

params가 값을 가질 수있는 기호 인 param-> value 규칙의 목록이 있다고 가정합니다. 예를 들면 다음과 같습니다.Hold'd 식에서 물건을 추출 할 때의 어색함

{a, b, c} = {1, 2, 3}; 
x = Hold[{a->1, b->2, c->3}]; 

목록에 대기열이 있어야합니다. 그렇지 않으면 {1-> 1, 2-> 2, 3-> 3}이됩니다. (나는이 쉽게의 나머지 부분을 만드는 경우 어떤 대안이 보류하기에 개방적이야.)

지금 나는이에 X를 변환 할 가정 :

{"a"->1, "b"->2, "c"->3} 

다음 함수는이 작업을 수행합니다

f[h_] := Block[{a,b,c}, ToString[#[[1]]]->#[[2]]& /@ [email protected]] 

내 질문 : {a, b, c} 기호 목록을 명시 적으로 제공 할 필요가없는 f 버전을 작성할 수 있습니까?

+0

뭔가 보인다'블록 [이름 [ "Global' *"], ... ' – dreeves

답변

5

여기 Unevaluated를 사용하는 방법입니다 :

In[1]:= {a, b, c} = {1, 2, 3}; 

In[2]:= x = Hold[{a -> 1, b -> 2, c -> 3}]; 

In[3]:= ReleaseHold[ 
x /. (symb_ -> e_) :> ToString[Unevaluated[symb]] -> e] 

Out[3]= {"a" -> 1, "b" -> 2, "c" -> 3} 
+0

+1 좋습니다! 내 것보다 훨씬 더 우아한 ... –

+0

이것은 광고 된대로 작동 함을 확인했습니다. 정말 고마워! – dreeves

+1

ToString 대신 SymbolName을 사용하면 작동합니다. 하나 또는 다른 것을 선호하는 이유가 많은지 궁금합니다. – dreeves

1
{a, b, c} = {1, 2, 3}; 
x = Hold[{a -> 1, b -> 2, c -> 3}]; 
f[x_] := Cases[x, HoldPattern[z_ -> y_] :> 
        StringTake[ToString[([email protected])], {6, -2}] -> y, 2]; 
f[x] // InputForm 
아웃

: 아마도 매우 우아하지

{"a" -> 1, "b" -> 2, "c" -> 3} 

,하지만 작동하는 것 같다.

+0

감사합니다! 나는 그'StringTake [..., {6, -2}]에 대해 걱정하고 있습니다. 규칙의 오른쪽에 긴 변수 이름과 임의의 물건이 얼마나 강력한가? 오, 그 안에있는 것이 무엇이든 추출 만하면됩니까? [...]? 어쩌면 충분히 안전 할 수도 있습니다. – dreeves

+0

@dreeves SymbolName []은 문자열을 반환하므로 어떤 심볼도 안전하게 문자열로 취급 될 수 있다고 생각합니다. 그렇습니다. 그냥 Hold [] 인수를 얻는 것입니다. –

+0

@dreeves 규칙의 rhs는 그대로 유지됩니다. lhs는 Hold [SymbolName]입니다. 따라서 안전하다고 생각합니다. –

1

이 오래된 질문을 조금,하지만 난 Andrew Moylan's answerbelisarius' answer 모두의 장점을 결합 답이 있다고 생각. Hold이 전체를 감싸는 규칙 목록 대신 왼쪽에 HoldPattern과 함께 규칙 목록을 갖고 싶으므로 ReleaseHold 프로세스를 거치지 않고 실제로 규칙을 사용할 수 있습니다.

In[1]:= {a, b, c} = {1, 2, 3}; 

Unevaluated

또한 당신이 원하는 목록의 종류를 구축하는 데 도움이 될 수 있습니다
In[2]:= x = Thread[HoldPattern /@ Unevaluated[{a, b, c}] -> Range[3]] 
Out[2]= {HoldPattern[a] -> 1, HoldPattern[b] -> 2, HoldPattern[c] -> 3} 

지금 당신은 당신이 규칙 교체와 함께 원하는 것을 할 수 있습니다. 조금 복잡하지만, 반복해서 반복해서 해보는 뭔가입니다. 이 규칙 목록은 거의 정확히 OwnValues 또는 DownValues의 목록 형식이므로 조작이 가능하므로 매우 유용합니다. 트릭은 콘서트에서 HoldPatternVerbatim을 사용하고 있습니다 :

In[3]:= f[rules_] := 
     Replace[rules, 
      HoldPattern[Verbatim[HoldPattern][s_Symbol] -> rhs_] :> 
      With[{string = ToString[Unevaluated[s]]}, 
      string -> rhs], {1}] 

Replace의 수준의 스펙은 그냥 거기에 있는지 아무것도 예기치 않은 수 있도록하는 것입니다 rhs는 자체 규칙 또는 규칙의 목록을 경우 발생합니다. 거의 작동처럼 같은

In[4]:= f[x] // InputForm 
Out[4]= {"a" -> 1, "b" -> 2, "c" -> 3} 
관련 문제