トップ «前の日記(2014-12-11(Thu)) 最新 次の日記(2014-12-15(Mon))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2014-12-13(Sat) また寒く晴れた。摂氏四度

引数が4つあるとうまくいかない

Ubuntu 14.04LTSのGNU Smalltalk 3.2.4-2。

st> three := [: f :s : t | (f + s * t) printNl ].
a BlockClosure
st> three value: 2 value: 5 value: 7.
49
49
 
st> four := [:f :s :t :fo | (f + s - t * fo) printNl ].
a BlockClosure
st> four value: 2 value: 5 value: 7 value: 3.
Object: BlockClosure new "<0x2b9c7c05eb20>" error: \
 did not understand #value:value:value:value:
MessageNotUnderstood(Exception)>>signal (ExcHandling.st:254)
BlockClosure(Object)>>doesNotUnderstand: \
 #value:value:value:value: (SysExcept.st:1407)
UndefinedObject>>executeStatements (a String:1)
nil

Squeak 3.9 では(少し違うけど)うまくできた。

four := [:f :s :t :fo | Transcript show: f + s - t * fo ].
four value: 5 value:2 value:4 value:6. => 18

なんとなくfortran

UbuntuにはGNU Fortran のパッケージが4.{4,6,7,8}とあった。
とりあえずは一番大きい数字を。
チュートリアルを見て、Hello, Fortranしてみる。

program hello
  print *, 'Hello World!'
  ! コメント行だよ。
  print *, '世界よ、&
&こんにちは'
  print *, '8885828888888888'
  print *, -2147483647; print *, 2147483647
  print *, 'foo', 'bar'
  print *, 0.3
  print *, 3 + 7 * 4.1
  PrInT *, 10 / 3
  print *, 10 / 3.0
  print *, mod(10, 3)
end program hello
$ gfortran -Wall -o helfo hello.f90 && ./helfo
 Hello World!
 世界よ、こんにちは
 8885828888888888
 -2147483647
  2147483647
 foobar
  0.300000012    
   31.6999989    
           3
   3.33333325    
           1

この単純な構文では、 2^31以上の整数は(Integerで)エラーになった。
行の分割は& Space NewLine Space &となるらしい。 行末と行頭に& で、その 間にスペースを入れてもエラーにならなかった。
; で複数の文を。
ソース一行の最大長はASCIIで132文字まで(行頭から改行まで)らしい。
とりあえずはこのあたりで。と書いた後で何度もアップデート。

とりあえずのfizzbuzz

書式指定が、かなりややこしく見えるので適当で我慢。

program fizzbuzz
  integer  i
  do i=1, 16, 1
    if (mod(i, 15) == 0) then
      print *, "fizzbuzz"
    else if (mod(i, 5) == 0) then
      print *, "buzz"
    else if (mod(i, 3) == 0) then
      print *, "fizz"
    else
      print *, i
    end if
  end do
end program fizzbuzz
$ ./fz
           1
           2
 fizz
           4
 buzz
 fizz
           7
           8
 fizz
 buzz
          11
 fizz
          13
          14
 fizzbuzz
          16

inspect

st> #(1 2 (3 4)) inspect
An instance of Array
  contents: [
    [1]: 1
    [2]: 2
    [3]: (3 4 )
  ]
(1 2 (3 4 ) )
st> foo := [:x :y :z | (x + y * z) printNl].
a BlockClosure
 
st> foo value: 2 value: 3 value: 4
20
20
 
st> foo inspect 
An instance of BlockClosure
  outerContext: nil
  block: [] in UndefinedObject>>executeStatements
  receiver: UndefinedObject
a BlockClosure

一円周をもう少し短く

(x - a)^2 + (y - b)^2 = r^2 の続き。
半円のブロックと、全円のブロックと、引数と。
なんかまだ冗長だけど。

ycal := [:x :r :b :nr| ((r * r) - (x * x)) sqrt * nr + b ].
dcircle := [:a :b :r :nr |
  circle := Pen new.
  circle up.
  r negated to: r do: [: x | 
    y := ycal value: x value: r value: b value:nr.
    circle goto: x+a@y; down ].
  circle up .]
 
#(1 -1) do: [:x | dcircle value: 50 value: 70 value: 20 value: x].

繰り返しの繰り返し、もしくはブロックのブロック

st> #(3 5 7 ) do: [:x | 1 to: 5 do: [:y | (x * y) printNl]].
3
6
9
12
15
5
10
15
20
25
7
14
21
28
35
(3 5 7 )

こっちのほうがわかりやすいかも。

st> #('foo: ' 'bar: ' 'baz: ') do: 
st>      [:x | #('1' '2') do: [: y | (x, y) printNl]].
'foo: 1'
'foo: 2'
'bar: 1'
'bar: 2'
'baz: 1'
'baz: 2'
('foo: ' 'bar: ' 'baz: ' )

リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。