REBOL2의 객체 / 함수에서 세 번째로 인해 발생함없는 블록은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/22053821

  •  21-12-2019
  •  | 
  •  

문제

나는 내부적으로 r2 상점을 두 개의 테이블로 읽고, 하나의 단어와 다른 값을 위해 하나씩,

o: context [a: 1 b: 2]
>> first o
== [self a b]
>> second o
== [make object! [
        a: 1
        b: 2
    ] 1 2]
.

어떤 식 으로든 ...

>> pick o 1
== [self a b]
>> pick o 2
== [make object! [
        a: 1
        b: 2
    ] 1 2]
.

그러나 문서화되지 않은 것처럼 보이는 세 번째 "테이블"(블록)이 있으며,이 하나는 세 번째 함수를 사용하여 만 액세스 할 수 있습니다

>> third o
== [a: 1 b: 2]

>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3
.

이 세 번째 블록이되는 것은 무엇입니까?

비슷한 기능이 기능에서 발생하는 것처럼 보이지만 이번에는 세 번째와 선택이 잘 수행됩니다.

>> f: func [a] [print a]
>> first :f
== [a]
>> second :f
== [print a]
>> third :f
== [a]
>> pick :f 1
== [a]
>> pick :f 2
== [print a]
>> pick :f 3
== [a]
.

첫 번째 블록은 매개 변수이지만 두 번째 블록은 본체이지만이 세 번째 블록은 함수에서 무엇을 나타 냅니까?

도움이 되었습니까?

해결책

보증금 :

>> third o
== [a: 1 b: 2]

>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3
.

... 이상한 것입니다. Rebol2에서 3 번째는 3 개의 가장자리 케이스의 경우 3의 선택과 순전히 동의어가 아니 었습니다. : - /

rebol3에서는 더 이상 사실이 아닙니다. 그러나 더 이상 어떤 것도 아닙니다. Rebol3 위치 따기는 객체 또는 기능에 사용할 수 없습니다.

>> pick object [a: 1 b: 2] 1
** Script error: pick does not allow object! for its aggregate argument
.

대신에 단어와 본문의 단어가 있습니다.

>> words-of object [a: 1 b: 2]
== [a b]

>> values-of object [a: 1 b: 2]
== [1 2]

>> body-of object [a: 1 b: 2]
== [
    a: 1
    b: 2
]
.

이들은 "r2 / forward"라는 내장 라이브러리에서 REBOL2로 백 포트 됨으로써 위치 선택 대신에 이러한 기능을 사용할 수 있습니다.

비슷한 답변을 첫 번째와 세 번째로 가져 오는 것을 알아 챘습니다.

>> f: func [a] [print a]

>> first :f
== [a]

>> second :f
== [print a]

>> third :f
== [a]

>> pick :f 1
== [a]

>> pick :f 2
== [print a]

>> pick :f 3
== [a]
.

첫 번째 블록은 매개 변수이지만 두 번째 블록은 본체이지만이 세 번째 블록은 함수에서 무엇을 나타 냅니까?

귀하의 사양은 단어 만 포함되어 있기 때문에 세 번째의 구별이 사양이었습니다. 그래서 spec-of는 단어와 같습니다. SPEC에 유형 제약 조건을 추가하면 차이점이 표시됩니다.

>> f: func [a [integer!]] [print a]

>> first :f
== [a]

>> third :f
== [a [integer!]]
.

다시 한 번 R2 / Forward를 통해 REBOL2는 기능의 단어와 본문을 제공합니다. 그리고 다시 한번, 이러한 속성에 대한 위치 선택을 사용하지 마십시오.

다른 팁

Third 객체 정의를 반환합니다.

>> body: [a: 1 b: 2]
== [a: 1 b: 2]
>> obj: context body
>> equal? body third obj
== true
>> strict-equal? body third obj
== true
.

REBOL 2.7.7 이상 및 rebol 3의 body-of와 동일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top