2010-06-18 9 views
1

내가 R3 알파 99 세션을 시작하고 첫 번째 명령으로 이것을 입력하면, 나는 오류 얻을 :EMAIL 같은 것을 바인딩 할 수없는 이유는 무엇입니까? 인터프리터 시작시 글로벌 컨텍스트에서?

>> is-email-addr: get bind to-word "email?" bind? 'system 
** Script error: email? is not in the specified context 
** Where: bind 
** Near: bind to-word "email?" bind? 'system 

을하지만 종료하면 다시 시작 대신은 그 email? 원시적 인 삶을 증명하는 테스트를 실행

>> equal? bind? 'system bind? 'email? 
== true 

>> is-email-addr: get bind to-word "email?" bind? 'system 
>> is-email-addr [email protected] 
== true 

, 여기에 무슨 일 : system 객체와 같은 글로벌 맥락에서, 시험 자체가 내 별명 일을 무엇입니까?

답변

5

당신이 말하지 않는 한 바인딩은 컨텍스트에 단어를 추가하지 않습니다. bind/new을 사용해야합니다.

>> get bind/new to-word "email?" bind? 'system 

그러나 질문은 R3 바인딩 모델에 대한 몇 가지 오해를 보여줍니다. R3에는 단일 글로벌 컨텍스트가없고 R2와는 다릅니다. 귀하의 예에서 단어 'system은 작업 - 로컬 공유 스크립트 컨텍스트, 즉 사용자 컨텍스트에 바인딩됩니다. 사용자 컨텍스트에서 단어에 적합한 값을 얻는 것은 종종 시스템 컨텍스트 또는로드 된 모듈의 내보내기에서 단어를 가져 오는 것을 의미합니다. 내부적 단어이라는 프로세스가 있습니다.

는이 같은 intern를 사용하는 것이 가장 좋은 것입니다, 당신은 분명히 여기에 수행 할 작업을 수행합니다

intern는 일반적으로 코드의 전체 블록에서 작동하는 데 사용되기 때문에 to-block 사용됩니다
>> get first intern to-block "email?" 

. 나는 다음 버전에서 그것을 고칠 것이므로 단어들도 직접 작업 할 수있다. 그러면 다음을 수행 할 수 있습니다.

>> get intern to-word "email?" 

이 정보가 도움이되기를 바랍니다.

왜 직접 단어를 사용하지 않습니까? 나중에 문자열을 사용하고 단어로 변환하면 너무 많은 오버 헤드가 발생하며 일반적으로 불필요합니다.

+0

을 신선한 인터프리터에 바인드를 얻을 수 *,/새에 단어 "이메일 ? " 묶다? '시스템 *이 작동하지 않습니다. 사실이 명령을 실행하면 인턴 사례가 나중에 실패하게됩니다. 그러나 바인드 후 인터프리터가 다시 시작되면 LOAD와 마찬가지로 INTERN 예제가 작동합니다. 왜? – HostileFork

+0

AltME에서 언급했듯이 단어를 직접 사용하지 않는 이유는 * "em"* 및 * 'email! *를 사용하는 단순 리매 퍼를 작성하려고 시도하고 * em? *를 * email? *의 별칭으로 만들기 위해 약어를 사용하고 * em! * * 이메일! *. 이를 위해서는 단어 사이의 문자열 관계를 악용해야합니다. – HostileFork

+0

"Whyzzat?" 그 명령을 실행할 때 'email'이라는 단어를 추가했기 때문에? 값이 할당되지 않은 사용자 컨텍스트에 할당하고 시스템 또는 내보내기 컨텍스트에서 값을 마이그레이션하지 않습니다. 나중에 INTERN을 실행하면 (LOAD는 INTERN을 호출 함), 사용자 컨텍스트에서 기존 단어를보고 사용자 단어이기 때문에 무시하지 않습니다. 기본적으로 사용자 컨텍스트는 시스템 컨텍스트 및 내보내기 컨텍스트로 채워지지 않으며 필요시 채워집니다. 시스템 값을 원하면 처음부터 INTERN을 사용하는 것이 좋습니다. – BrianH

1

"이메일을 사용 하시겠습니까?" 문자열 대신 '전자 메일? 단어, 다음, 다음과 같이 LOAD 기능을 사용하는 것입니다 어떤 strangenesses을 관찰하지 동안 그것에서 단어를 얻기위한 가장 간단한 방법 :

is-email-addr: get bind load "email?" bind? 'system