2013-05-09 2 views
3

스크립트 헤더의 요구 사항 필드를 처리 할 때 R3의 동작과 단어 바인딩에 어떤 영향이 있는지 알고 싶습니다.R3는 스크립트 헤더의 필요 필드를 어떻게 사용합니까? 네임 스페이스에 어떤 영향이 있습니까?

배경. 현재 R3을 배우기 위해 R2 스크립트를 R3에 이식하려고합니다. R2에서 스크립트 헤더의 Needs 필드는 기본적으로 문서 였지만 스크립트를 실행하는 데 필요한 스크립트를 참조하는 사용자 지정 함수를 사용했습니다.

R3은 Needs 참조 스크립트 자체를 호출하는 것처럼 보이지만 바인딩은 다른 스크립트를 수행하는 것과 다릅니다.

예를 들어 %의 테스트 parent.r 인 경우 :

REBOL [ 
    title: {test parent} 
    needs: [%test-child.r] 
] 

parent: now 
?? parent 
?? child 

와 % 테스트 아이이다 : 09 :

REBOL [ 
    title: {test child} 
] 

child: now 
?? child 

R3 알파 (Saphiron 22-2 월 11분의 2,013 빌드 : 25)을 반환 테스트 부모 %의 시험 child.r 설정 자식에 액세스 할 수없는 이유

>> do %test-parent.r 
Script: "test parent" Version: none Date: none 
child: 9-May-2013/22:51:52+10:00 
parent: 9-May-2013/22:51:52+10:00 
** Script error: child has no value 
** Where: get ajoin case ?? catch either either -apply- do 
** Near: get :name 

가 이해가 안

test-parent.r 헤더에서 Needs 필드를 제거하고 대신 DO % test-child.r에 행을 삽입하면 오류가없고 스크립트가 예상대로 수행됩니다.

답변

2

아, 당신은 Rebol 3의 정책에 "당신이 말하는 것을하십시오, 당신의 마음을 읽을 수 없습니다"라고 말했습니다. R3의 Needs 헤더는 모듈 시스템의 일부이므로, Needs으로로드하는 모든 항목은 실제로 선언되지 않은 경우에도 실제로 모듈로 가져옵니다.

과 함께 스크립트를로드하는 것은 원래 작성자에서 모듈로 처리되도록하는 빠른 방법입니다. 모듈은 단어가 정의 된 고유 컨텍스트를 갖습니다. 스크립트를 모듈로로드하는 것은 깔끔하지 않은 스크립트를 사용하여 단어를 공유 스크립트 컨텍스트에 누설하는 좋은 방법입니다. %test-child.r 스크립트와 마찬가지로 child이라는 단어가 스크립트 컨텍스트에 누출됩니다. 그런 일이 발생하지 않도록하려면 어떻게해야합니까? Needs 또는 import으로로드하면 바로 청소할 수 있습니다.

스크립트를 스크립트로 취급하려면 do을 사용하십시오. 일반 스크립트는 (주로) 공유 컨텍스트를 사용하므로 do 스크립트는 호출 한 스크립트와 동일한 컨텍스트에 영향을줍니다. 그렇기 때문에 child: now 문이 상위 스크립트의 child에 영향을 미쳤습니다. 때로는 그게 당신이하고 싶은 일입니다. 그래서 우리는 R3에서 스크립트가 그렇게 작동하도록 열심히 노력했습니다.

당신은, 당신의 자신의 스크립트를로드 할 수 Needs 또는 import을 사용하려는 경우 당신은뿐만 아니라 그들에게 모듈을 만들어 같이, 당신이 원하는 내보낼 수 있습니다 당신도 그렇지,

REBOL [ 
    type: module 
    title: {test child} 
    exports: [child] 
] 

child: now 
?? child 

을 이전과 그래도 Needs 또는 import을 사용하려는 경우 type: module을 포함해야하지만, do으로 모듈을 실행하는 경우 도움이됩니다. R3은 모듈을 모듈로 선언하면 모듈로 작성하고 do으로 호출해도 모듈에 의존한다고 가정합니다.최소한 type 헤더를 선언하는 것은 type 헤더를 전혀 선언하지 않는 것보다 더 강력한 진술이므로 충돌하는 "do you say say"상황에서 우선합니다. How are words bound within a Rebol module?

+0

감사 브라이언 :

은 모듈 시스템의 작동 방법에 대한 자세한 내용은 여기를 봐! 내 스크립트가 R2와 R3 모두에서 멋지게 재생되도록 노력하면서 뭔가 씹을 필요가 있습니다. – Brett

+0

글쎄, 그건 생각보다 간단 해. R2는 버전과 구성 요소 요구 사항 이외에는 니즈 헤더를 사용하지 못하게한다. 따라서 R2와 R3에서 코드를 작동시키는 유일한 방법은'do'를 사용하고 모듈을 포기하는 것입니다. R2에 대한 요구 사항 제한을 완화하는 것이 다음 버전의 todo 목록에있었습니다. 새로운 R2 버전은 계획되지 않았습니다. 우리는 R3 모듈 시스템의 하위 집합의 백 포트를 R2로 만들려고했습니다. – BrianH

+0

안녕하세요 Brian, 언제나처럼 훌륭한 정보. 스크립트를 모듈로 로딩하는 것과 관련하여 한 가지 더 질문 : 모듈로로드 된 스크립트는 현재 상황으로 가져올 수 없으므로 부작용 만로드 할 수 있습니다. 스크립트에서 가져올 단어를 정의하기 위해 가져 오기에 다른 상세 검색 기능을 추가하는 것이 합리적일까요? – ingo