プログラミングOcaml
個人的な勉強なので、決して参考にはしないでくだしあ。なお、ツッコミは大歓迎。とはいえ、人に読んでもらうのを目的にしていないので、ご了承くだされ。
※ Ocamlの言語的な問題(型チェックや文法エラーの説明等)は無視。
今日は練習問題3.3まで。
use strict; #no strict 'refs'; no warnings 'redefine'; sub p{ my $f=shift; my $r=$main::{$f}->(@_); printf "%s(%s) => %s\n",$f,join(',',@_),defined $r ? $r : '""' } #### 2.3.1 my $pi = 3.1415926535; #### 3.1 sub area_of_circle{ my ($r) = @_; $r * $r * $pi; } p 'area_of_circle',2; #### 3.2 sub _abs{ my ($x) = @_; 0 < $x ? $x : -$x; } p '_abs',-2; p '_abs',5; p '_abs',-3; sub area_of_circle{ my ($r) = @_; 0 < $r ? $r * $r * $pi : 0; } p 'area_of_circle',3; sub is_positive{ my ($x) = @_; 0 < $x; } map { p 'is_positive',$_; } (3,-9); sub is_hitoketa{ my ($x) = @_; 1 <= $x && $x < 10; } map{ p 'is_hitoketa',$_; } (0,1,5,9,10); sub is_teenager{ my ($x) = @_; 13 < $x && $x < 20 } #### 3.3 sub vol_cone{ # 半径2.0高さ5.0の円錐の体積 my $base = $pi * 2.0 * 2.0 * 5.0; $base / 3.0; } p 'vol_cone'; sub cone_of_heightTwo{ my ($r) = @_; my $base = $r * $r * $pi; $base * 2.0 / 3.0 } sub f{ my ($x) = @_; my $x3 = $x * $x * $x; my $x3_1 = $x3 + 1; $x3 + $x3_1; } sub g{ my ($x) = @_; my $power3 = sub{ my ($x) = @_; $x * $x * $x; }; $power3->($x) + $power3->($x+1); } p 'f',10; p 'g',10; #### 練習問題3.1 my $yen = 114.32; sub shishagonyu{# 少数第一位を四捨五入 my ($x) = @_; my $int_x = int($x); my $y = $x - $int_x; $int_x + ($y < 0.5 ? 0 : 1); } sub doller2yen{ my ($x) = @_; shishagonyu($x * $yen) } map { p 'doller2yen',$_; } (1,2,2.5); sub yen2doller{ my ($x) = @_; shishagonyu($x / $yen * 100) / 100; } map { p 'yen2doller',$_ } (1,114.32,228.64,230); sub print_doller2yen{ my ($x) = @_; printf "%f doller is %d yen\n",$x,doller2yen($x); } print_doller2yen 3; sub capitalize{ my ($a) = @_; if(length $a > 1){print "invalid char :$a\n";return} my $x = ord($a); (97 <= $x && $x <= 122) ? chr($x - 32) : $a; } map{ p 'capitalize',$_ } ('a'..'z'),(0..10); #### 練習問題3.2 sub b_a1{ my ($b1,$b2) = @_; $b1 && $b2; } sub b_a2{ my ($b1,$b2) = @_; if($b1){$b2}else{0} } sub b_b1{ my ($b1,$b2) = @_; $b1 || $b2; } sub b_b2{ my ($b1,$b2) = @_; if($b1){1}else{$b2} } map { p $_,0,0; p $_,0,1; p $_,1,0; p $_,1,1; print "-----\n"; } qw(b_a1 b_a2 b_b1 b_b2); #### 練習問題3.3 sub b_a3{ my ($b1,$b2) = @_; !(!$b1 || !$b2); } sub b_b3{ my ($b1,$b2) = @_; !(!$b1 && !$b2); } map { p $_,0,0; p $_,0,1; p $_,1,0; p $_,1,1; print "-----\n" } qw(b_a3 b_b3)
出力
area_of_circle(2) => 12.566370614 _abs(-2) => 2 _abs(5) => 5 _abs(-3) => 3 area_of_circle(3) => 28.2743338815 is_positive(3) => 1 is_positive(-9) => is_hitoketa(0) => is_hitoketa(1) => 1 is_hitoketa(5) => 1 is_hitoketa(9) => 1 is_hitoketa(10) => vol_cone() => 20.9439510233333 f(10) => 2001 g(10) => 2331 doller2yen(1) => 114 doller2yen(2) => 229 doller2yen(2.5) => 286 yen2doller(1) => 0.01 yen2doller(114.32) => 1 yen2doller(228.64) => 2 yen2doller(230) => 2.01 3.000000 doller is 343 yen capitalize(a) => A capitalize(b) => B capitalize(c) => C capitalize(d) => D capitalize(e) => E capitalize(f) => F capitalize(g) => G capitalize(h) => H capitalize(i) => I capitalize(j) => J capitalize(k) => K capitalize(l) => L capitalize(m) => M capitalize(n) => N capitalize(o) => O capitalize(p) => P capitalize(q) => Q capitalize(r) => R capitalize(s) => S capitalize(t) => T capitalize(u) => U capitalize(v) => V capitalize(w) => W capitalize(x) => X capitalize(y) => Y capitalize(z) => Z capitalize(0) => 0 capitalize(1) => 1 capitalize(2) => 2 capitalize(3) => 3 capitalize(4) => 4 capitalize(5) => 5 capitalize(6) => 6 capitalize(7) => 7 capitalize(8) => 8 capitalize(9) => 9 invalid char :10 capitalize(10) => "" b_a1(0,0) => 0 b_a1(0,1) => 0 b_a1(1,0) => 0 b_a1(1,1) => 1 ----- b_a2(0,0) => 0 b_a2(0,1) => 0 b_a2(1,0) => 0 b_a2(1,1) => 1 ----- b_b1(0,0) => 0 b_b1(0,1) => 1 b_b1(1,0) => 1 b_b1(1,1) => 1 ----- b_b2(0,0) => 0 b_b2(0,1) => 1 b_b2(1,0) => 1 b_b2(1,1) => 1 ----- b_a3(0,0) => b_a3(0,1) => b_a3(1,0) => b_a3(1,1) => 1 ----- b_b3(0,0) => b_b3(0,1) => 1 b_b3(1,0) => 1 b_b3(1,1) => 1 -----