どんなメソッドがあるのかわからない!
2010-12-03
とりあえずPerl6入れてみたはいいけど、どう書けばいいのかわからない!そうですよね。どこからとっかかればいいか、ポインタをご紹介します。
まずはdocs以下
ダウンロードしてきたrakudo-star-2010.11ディレクトリ以下にdocsディレクトリがありますね。ここに「UsingPerl6-draft.pdf」というPDFとcheatsheet.txtというのがあります。
PDFは英語ですが順を追ってPerl6の機能を紹介してあるので、ざっと一度読んでおくとよいでしょう。こちらでオンラインで読めるので、インストールするほどじゃないけど興味があるな、という方もぜひ読んでみてください。
cheetsheet.txtの中身はこんなのです。
Perl 6 cheat sheet v2 »ö« SIGILS MAJOR/MINOR CONTEXTS ACCESS ARRAYS HASHES $scalar item list sink whole: @array[] %hash{} @array Str flat/slice element: @array[0] %hash{'a'} %hash Num lazy/eager/hyper (or) %hash<a> &code Bool slice: @array[0,2] %hash{'a','b'} COMPOSERS (or) %hash<a b> TWIGILS [ ] array $normal-lexical { } block/hash AUTOMATIC DEREFERENCE $?compiler-constant < > quotewords &($foo)(1,2) == $foo(1,2) $*dynamic-or-global (,) parcel @($foo)[1] == $foo[1] $.public-accessor :() signature %($foo){'bar'} == $foo<bar> $!private-attribute \() capture @(@($foo)[1])[2] == $foo[1][2] $^positional-param $:named-parameter CONTROL SYNTAX $=pod-info for LIST { } # implicit $_ arg $<named-match-capture> for LIST -> $a, $b { } # explicit args $~slang-variable while/until EXPR { } repeat while/until EXPR { } # do at least once OPERATOR PRECEDENCE loop { } loop (a;b;c) { } # parens required! .method .[] i if EXPR { } elsif EXPR { } else { } ++ -- unless EXPR { } # no else allowed! ** given EXPR { when EXPR { } default { } } unary + - ~ ! ? ^ EXPR if EXPR for LIST; # list comprehension * / % %% div next, last, redo # loop controls + - proceed, succeed # switch controls x xx TYPES ~ Bool Bit Int Rat FatRat UInt Num Complex int32 complex64 etc. & Str Cat Blob Char Byte Codepoint Grapheme Buf buf8 buf32 utf8 | ^ IO Mu Any Cool Junction Whatever Match sleep abs sin temp Parcel Capture Signature <=> leg cmp .. but SCOPE DECLARATORS Pair Range Set Bag ~~ > == gt eq === eqv !op my lexical scope KeyHash KeySet KeyBag && our package scope Scalar Array Hash Code || ^^ // min max has instance scope Enum Order TrigBase ??!! ff anon no scope at all Block Routine Sub = := op= => state persistent lexical Method Regex so not augment benign parasitic Failure Exception , : supersede deadly parasitic Instant Duration X Xop Z Zop ... Date DateTime say die map etc. OPERATOR DOMAINS and Numeric: == !==(!=) + < > <=> <= >= or xor Stringy: eq !eq(ne) ~ lt gt leg le ge <== ==> Value: eqv !eqv before after cmp !after !before ObjectID: === !=== METAOPERATORS LINKS IRC [op] reduce listop to A op B op C... perl6.org #perl6 irc.freenode.net op= A = A op B rakudo.org #parrot irc.perl.org !op !(A op B) »op« hyper/vectorize REGEX METACHARS REGEX MODIFIERS Zop zip with op ^ $ string begin/end :i ignore case Xop cross with op ^^ $$ line begin/end :m ignore marks Rop reverse args + one or more :g global Sop sequentialize * zero or more :r ratchet ? zero or one :s sigspace SPECIAL VARIABLES **1..3 repeat in range :4th nth occurrence $_ current topic () capture to $0,$1 :4x n times $/ regex result [] no capture $! error object <foo> subrule REGEX CHARCLASSES @*ARGS command line <[]> character class . == anychar, \N non \n @*INC include path | parallel or \s == <space>, \S non %*ENV environment || serial or \d == <digit>, \D non $*PID process id « » word boundary \w == <+alpha+digit+[_]>
うわあ。perl5とperl6の書き方が違う気がする!と思った瞬間にさっと開いてカンニングしましょう。
「こんなことがしたいのに!」というとき
たとえば日付がらみの処理がしたいけど、どんなメソッドがあるのかわからない、そんなときは
$ cd ~/tmp/rakudo-star-2010.11/rakudo/t/spec $ grep -lr date *
などとしてテストをほじくります。するとS32-temporal/Date.tというのが見つかるので、この中身をまねしてみればいいだろう、ということになります。
注意しなければいけないのは、tディレクトリに入っている.tファイルだからといってテストされるとは限らない点です。t/spectest.dataというファイルに実際にテストされるファイルが列記されていて、たまにコメントアウトされてます。その場合、テストはあるけどそのバージョンのperl6ではそのとおりには動かないと思った方が良いでしょう。