プログラミング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
-----