2009-10-09 2 views
1

rebol 헤더 파일에 나열된 여러 개의 libs를 자동으로로드하는 do-libs generic 함수를 만들고 싶습니다. 나는 선택적 매개 변수를 만들고 싶지만 그 후에는 왜 작동하지 않습니까?Rebol 및 unset (optional) 매개 변수

Rebol[ 
    libs: [  
    lib1/lib11.r 
    lib1/lib12.r 
    lib2/lib21.r 
    ] 
] 
do-libs 'libs ; works 
do-libs ; doesn't work 

:이 전문가가 아니에요

do-libs: func[libs [word! unset!]][ 

    if/else value? 'libs [ 
    foreach lib system/script/header/:libs [ 
     if/else file? lib [ 
     do lib 
     ][  
     do file: to-rebol-file mold lib 
     ]  
    ] 
    ][ 
    ;case with no parameter 
    do-libs 'libs 
    ] 
] 
+0

이제 R3을 완전히 사용하도록 전환했습니다. 필요한 모든 것을 사용할 수있는 시점에 있으며 모듈 시스템은 정말 훌륭합니다. –

+0

안녕하세요 고마워 할 것입니다 : 지금까지 그렇게 한 적이 없어! –

답변

1

,하지만 내 을 인수 생략을 허용하는 기능을 만들기 위해, 그것은 문자 그대로 인수 여야한다는 것이다 이해 예 :

do-libs: func [ 'libs [word! unset!] ] [ 
    ; blah blah 
]

libs 인수는 lit-word!입니다.

do-libs libs

또는

do-libs

그러나, 이것에주의 : 이것은 또한 다음과 같이이 함수를 호출해야 의미합니다. REBOL은 새로운 라인을 존중하지 않습니다. 당신이 말한다면 : 그것은 do-libs에 인수로 삼을 생각하고 함수 호출이 실패합니다

do-libs 
3

. 당신이

do-libs 
print "ok"

을 말한다면 그것은 do-libs'libs 인수로 print 간주됩니다. 사실, REBOL은 위의 내용을 다음과 같이 해석합니다.

(do-libs print) "ok"

결론은 REBOL의 대화식 모드를위한 것입니다. 당신이하려는 것을하기 위해 그것을 사용해서는 안됩니다. 대신, 기능은 아마도 다음과 같아야합니다

do-libs: func [ /name 'word [word!] ] [ 
    if none? name [ word: 'libs ] 
    ; and so on 
]

지금 당신이 더 자연, 관용적 REBOL입니다

do-libs

또는

do-libs/name foo

말할 수 있습니다. 일반적으로 선택적 인수를 전달하려면 상세 검색을 사용해야합니다. 인수의 수가 알려지지 않거나 무제한 일 경우 block!을 사용해야합니다.

REBOL 인터프리터가 작동하는 방식 때문에 REBOL이 다른 많은 언어 (C, C++, Ruby 등)의 "param array"스타일 인수를 지원할 가능성은 거의 없습니다. 전체 표현식이 다음과 같이 괄호 안에 위치하지 않는 한, 해석기는 인수 목록이 끝나는 위치를 알 수 없습니다.

(foo 1 2 3 "a" "b" "c")
+0

안녕하세요 고맙습니다. 글쎄, 내가 정교함을 사용해야한다는 것을 안다. 이유를 이해하고 싶다. 이 예제 http : // reboltutorial가 있기 때문이다.co.kr/blog/optional-parameter /는 작동했고 나는 문자적인 인수를 사용하지 않았다. –

+0

내가 lib 대신 libs를 넘기는 이유는 "lib1/lib11.r"과 같은 lib를 인용 할 필요가 없다는 것입니다. –

+1

R3에서는 인용 부호가 없으면 생략 할 수 없지만 R2에서는 양철통. (필자는 URL 매개 변수가 주어지지 않았을 때조차도 뷰탑 기능이 R2에서 실행되는 방법에 대해 의문을 품기 때문에이 질문을 발견했습니다.) 정제를 사용하면 더 일관성있게 사용할 수 있다는 요지를 이해할 수 없습니다. – HostileFork