僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
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
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文字まで(行頭から改行まで)らしい。
とりあえずはこのあたりで。と書いた後で何度もアップデート。
書式指定が、かなりややこしく見えるので適当で我慢。
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
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や内容が変った場合はあしからず。