2017-01-11 4 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には暗黙的に平坦化されておらず、(ネイティブでない配列の)配列の変更可能性は、その要素をスカラーコンテナに入れることによって実現されることに注意してください。

おそらく次のコードは、さらに何が起こっているのか明確になり、あなたの質問に編集を考えると

# 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(ただしFETCH)は、スカラーが行うことができますしながら、どちらも

これは驚くかもしれません.1つは、割り当て可能なものがSTOREであることが予想されるかもしれません。実装を見てみると

、我々は我々do call STORE、印章@%での変数のことを見ますが、$印章を持つ変数のためnot so。ウサギの穴をさらに通り過ぎると、最終的にはVM level container specificationになります。これは、スカラーコンテナへの割り当て(またはProxyオブジェクトのSTOREメソッドの呼び出し)がどのように実装されるかです。

+1

"期待どおり"は私が期待したものではありません。 :) –

+0

@briandfoy:別のコード例を追加しました – Christoph

+1

"ちょうど命名の偶然の一致"について確信していますか?配列*は代入の左側で使用でき、その意味ではコンテナです。STOREメソッドが 'Array'と' Proxy'の両方で何をするのでしょうか? – smls

関連する問題