2013-05-06 3 views
3

parse을 사용하여 데이터에서 값을 추출 할 때 종종 글로벌 선언을 통해 copy 데이터를 캡처합니다. 예를 들어 ,구문 분석을 사용하여 데이터를 복사 할 때 네임 스페이스 오염 최소화

numbers: none 
rule: [ thru 5 copy numbers to 10 to end ] 
parse [ 1 2 3 4 5 6 7 8 9 10 ] [ rule ] 

무엇 글로벌로 numbers를 사용하지 않고이 작업을 수행하는 가장 좋은 방법이 될 것입니다? 을 전체적으로 래퍼로 정의해야합니까? 아니면 좀 더 우아한 솔루션이 있습니까?

답변

2

컨텍스트 당신이 그들 글로벌 이름을 오염 중지하는 지역으로 선언 된 변수와 함수 내부에 구문 분석 규칙을 사용하여 같은 방법으로 상황에 맞는

>> unset 'a 
>> context [ parse "aa" [ copy a to end ]] 
>> a 
== "aa" 

내부의 변수를 선언하지 않고 작동하지 않습니다 공간.

6

R2의 관점에서. 그렇습니다. CONTEXT를 사용하여 컨텍스트에서 전체를 래핑하는 것은 간단합니다.

 
use [numbers][ 
    numbers: none 
    rule: [ thru 5 copy numbers to 10 to end ] 
    parse [ 1 2 3 4 5 6 7 8 9 10 ] [ rule ] 
] 

Graham이 말한 것처럼 기본적으로 NUMBERS를 none으로 설정하는 함수의 지역 변수를 사용하십시오.

종종 컨텍스트가 일시적이거나 개인 컨텍스트를 만들기 위해 USE를 사용합니다.

+0

CONTEXT를 사용할 필요가 있으므로이 경우 "numbers : none"을 입력 할 필요가 없습니다. – endo64

+1

Endo 네, 규칙이이 예제와 같이 성공하지만 처음 네 개의 숫자 만 들어 있고 "numbers : none"이 없으면 숫자에 아무런 값이 없으므로 설정이 해제됩니다. 이는 Rebol 2에서 USE를 사용하는 기본 동작입니다. 원할 수도 있고 그렇지 않을 수도 있습니다. Rebol 3의 USE는 다른 동작을 가지며 숫자를 자동으로 none으로 설정합니다. – Brett

+0

Brett, 고맙습니다. USE가 R3에서 다르게 동작한다는 것을 몰랐습니다. – endo64