Perl

Perl6はまだ様子見する。

そろそろかなとrakudo(#29)を触ってみた感想。もう少し待とう・・・。とりあえず触った事を記録。試したのは加算器関数。まず、イメージで実装してみる。 sub make_adder($n) { {$n += $^i} } my $adder30 = make_adder(30); $adder30.(1).say; # 31になる $…

PerlでDSL

『Rubyによるデザイン・パターン』を読み終えて内部DSLが分かった気になった。調子に乗ってPackRat*1をPerlに移植してみた。少しPerl風にアレンジ。まず、内部DSLから。 # 内部DSL(backup.pr) backup { from => '/home/hoge/old1', to => '/tmp/backup', fil…

Perlで対話型コマンドの実行

前回はTeraTermマクロで対話型コマンドの実行をがんばった。けど扱いづらい。Perl使いたい。というわけで、telnetコマンドをfork/execしてpipeで標準入出力を操作してみた。*1 *2まず、ファイルハンドルから値を読み込む関数と書き出す関数。読み出しでは応…

Perlで継続

現在、『On Lisp』が3巡目の終盤に差し掛かっている。でも、いまいち継続を理解できていない。分かり易い解説を見つけたのでPerlに翻訳してみた。(本を読む FizzBuzzとGaucheで学ぶ継続の基礎) use strict; use warnings; sub fizzbuzz { my ($next, ($n)) …

副作用関数のユニットテスト

ユニットテストの自動化で困るのが副作用を起こすコード。例えば、ファイルのI/Oを含む関数は自動テスト化に少し悩む。 # hoge.pl use strict; use warnings; package HOGE; use IO::File; main(@ARGV) if ($0 eq __FILE__); # テストしたい関数 sub main { …

Perlで遅延評価

遅延評価とは、HaskellやD言語なんかにある「アレ」のことだ。 遅延評価(ちえんひょうか、lazy evaluation、delayed evaluation)とは、計算機科学におけるプログラムの評価手法の一つ。主に関数型言語で使用される。対義語は先行評価(eager evaluation、s…

Perlでbind

関数に引数を束縛するbind関数のperl版。 sub sub_bind { my ($sub, @args) = @_; sub { $sub->(@args, @_); }; } 上位は呼び出すだけにしたい場合などに重宝する。

map and grep, foreach on C

Perlでリスト処理といえばmapとgrepにforeachだと思う。 たとえば、こんな感じで使える。実行すると"6 12 18 24 30"が標準出力に出力される。 #! /usr/bin/perl use strict; use warnings; # 要素に1から10を持つリストを生成する。 my @list1 = (1..10); # …

クロージャによるクラスの代替

個人的にクロージャが使えればクラスの構文は要らないと思っている。例としてスタックを表すクラスをクロージャを使って定義してみる。まず、D言語で。

Perlのサブルーチン定義を簡素化

Perlはサブルーチンの引数を明示的に取り出さなくてはならない。 たとえば、数nを+1するサブルーチンの定義は次のようになる。 # 定義 sub inc { my ($n) = @_; $n + 1; } # 呼び出し print inc(255) , "\n"; # 256と表示 めんどくさい。Rubyっぽくしたい。 …