2017-01-11 8 views
5

나는 이것을 알기위한 유용한 이유가 없다. 그러나 스칼라 변수 (가변적 인 것) 또는 단순한 무언가 (변경 불가능한 것)의 이름 인 경우 $x과 같은 이름이 있는지 궁금하다. 나는 아무것도 성취하려고 노력하지 않고있다. 이것은 호기심입니다.어떤 것이 Perl 6 컨테이너인지 어떻게 알 수 있습니까?

내가 이런 식으로 주위를 연주했다 :

my @a = 'a', ('b', 'c'); 
my @b = 'd', 'e', 'f', @a; 

my @ab = @a, @b, (1, 2); 

for @ab { 
    put "name: {.^name} VAR: { .VAR.^name }"; 
    when .VAR.can('FETCH') { put "Container: $_" } 
    when .VAR.can('STORE') { put "Container: $_" } 
    when Scalar   { put "Scalar container: $_" } 
    when Array    { put "Array Container: $_" } 
    default    { put "Object: $_" } 
    } 

내가 얻을 :

name: Array VAR: Scalar 
Array Container: a b c 
name: Array VAR: Scalar 
Array Container: d e f a b c 
name: List VAR: Scalar 
Object: 1 2 

내가 유형을 Array 유형의 일치를 일치시킬 수 있음을 알 수 있지만, 내가 확인 생각 뭔가 할 수 FETCH 또는 STORE이 적합합니다.

+0

'VAR'에 대해 이미 알고있는 내용을 잘 모르는 경우, 더 낮은 레벨에 네이티브 컨테이너의 경우 'nqp :: iscont', nqp :: isrwcont' 및'nqp :: iscont_ [ins]'도 있습니다. – Christoph

+0

VAR 검사가 작동하지 않는 것 같습니다. 나중에 대답을 수정하겠습니다. –

+1

배열은 그 값을 컨테이너 화한다는 것을 기억하십시오. 그래서 당신의 예제에서,'@ ab'의 모든 요소는 당신이'@ab'에 넣기 전에 컨테이너에 싸여 있더라도 상관없이 컨테이너에 싸여 있습니다. – smls

답변

4

당신이 여기에 무엇을 묻고 있는지 확실하지 않지만 입력이 주어지면 예상대로 출력됩니다.

설명하는 간단한 예 :

my (@a, @b, @c); 
my @ab = @a, @b, @c; 

for @ab { 
    say "{.^name} contained in a {.VAR.^name}"; 
} 

되는

Array contained in a Scalar 

세번 출력 것없이 @a, @b@c의 contens.

Perl6에는 암시 적 병합이없고, (원시이 아닌 배열의) 배열 가변성은 해당 요소를 스칼라 컨테이너에 넣음으로써 실현된다는 것을 기억하십시오.


아마도 다음 코드는 더 무슨 일이 일어나고 있는지 명확합니다, 귀하의 질문에 편집을 감안할 때 : 단지리스트와 배열은 STORE이 (그러나 FETCH), 동안에게 스칼라 할 수 있습니다

# make argument raw so binding won't mess with it 
sub info($_ is raw) { 
    dd $_; 
    put " value type: {.^name}"; 
    put " VAR type: {.VAR.^name}"; 
    put " can fetch: {so .VAR.can('FETCH')}"; 
    put " can store: {so .VAR.can('STORE')}"; 
} 

my \values = 42, my $ = 42, [1, 2], (1, 2); 
info $_ for values; 

put "\n"; 

# put values in array, which wraps them in a scalar container 
info $_ for [values]; 

주 둘 다.

놀랍지 않을 수 있습니다. 하나는 할당 가능한 항목에 STORE을 제공해야합니다. 구현을 보면

, 우리가 볼 수있는 $시길와 변수시길 @%, 우리 do call STORE하지만 not so와 변수. 토끼 구멍을 내려 가면 VM level container specification으로 끝날 것입니다. 이는 스칼라 컨테이너에 대한 할당 (또는 Proxy 객체의 STORE 메소드 호출)이 구현되는 방식입니다.

+1

"예상대로"내가 예상 한 것이 아닙니다. :) –

+0

@briandfoy : 다른 코드 예제를 추가했습니다 – Christoph

+1

"그냥 명명 우연의 일치"에 대해 확실합니까? 배열 *은 할당의 왼쪽에 사용할 수 있으며, 그런 의미에서 배열입니다.STORE 메소드가'Array'와'Proxy' 모두에 대해하는 일이 아닙니까? – smls