SlideShare a Scribd company logo
ATSプログラミングチュートリアルATSプログラミングチュートリアルATSプログラミングチュートリアルATSプログラミングチュートリアルATSプログラミングチュートリアル
Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe
準備はできましたか?準備はできましたか?準備はできましたか?準備はできましたか?準備はできましたか?
ATS2コンパイラはインストール済みですか?
もし未だなら、次のマニュアルを参考にATS2を
インストールしてください:
ATS2コンパイラはインストール済みですか?
もし未だなら、次のマニュアルを参考にATS2を
インストールしてください:
ATS2コンパイラはインストール済みですか?
もし未だなら、次のマニュアルを参考にATS2を
インストールしてください:
ATS2コンパイラはインストール済みですか?
もし未だなら、次のマニュアルを参考にATS2を
インストールしてください:
ATS2コンパイラはインストール済みですか?
もし未だなら、次のマニュアルを参考にATS2を
インストールしてください:
☆ http://bit.ly/instatsj☆ http://bit.ly/instatsj☆ http://bit.ly/instatsj☆ http://bit.ly/instatsj☆ http://bit.ly/instatsj
またこのスライドのソースコードも入手できます:またこのスライドのソースコードも入手できます:またこのスライドのソースコードも入手できます:またこのスライドのソースコードも入手できます:またこのスライドのソースコードも入手できます:
☆ http://bit.ly/ats20150523☆ http://bit.ly/ats20150523☆ http://bit.ly/ats20150523☆ http://bit.ly/ats20150523☆ http://bit.ly/ats20150523
ATSって何でしょう?ATSって何でしょう?ATSって何でしょう?ATSって何でしょう?ATSって何でしょう?
http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/
☆ MLのような文法☆ MLのような文法☆ MLのような文法☆ MLのような文法☆ MLのような文法
☆ 依存型☆ 依存型☆ 依存型☆ 依存型☆ 依存型
☆ 線形型☆ 線形型☆ 線形型☆ 線形型☆ 線形型
☆ GCなしでも動作☆ GCなしでも動作☆ GCなしでも動作☆ GCなしでも動作☆ GCなしでも動作
☆ ランタイムシステムを持たない☆ ランタイムシステムを持たない☆ ランタイムシステムを持たない☆ ランタイムシステムを持たない☆ ランタイムシステムを持たない
☆ Dependent MLの後継☆ Dependent MLの後継☆ Dependent MLの後継☆ Dependent MLの後継☆ Dependent MLの後継
ATSを使うと何ができるの?ATSを使うと何ができるの?ATSを使うと何ができるの?ATSを使うと何ができるの?ATSを使うと何ができるの?
☆ 依存型を使ってコードに証明を与えられる☆ 依存型を使ってコードに証明を与えられる☆ 依存型を使ってコードに証明を与えられる☆ 依存型を使ってコードに証明を与えられる☆ 依存型を使ってコードに証明を与えられる
☆ 線形型を使ってmallocを安全に扱える☆ 線形型を使ってmallocを安全に扱える☆ 線形型を使ってmallocを安全に扱える☆ 線形型を使ってmallocを安全に扱える☆ 線形型を使ってmallocを安全に扱える
☆ 線形型を使ってポインタを安全に扱える☆ 線形型を使ってポインタを安全に扱える☆ 線形型を使ってポインタを安全に扱える☆ 線形型を使ってポインタを安全に扱える☆ 線形型を使ってポインタを安全に扱える
☆ 強い型をOSなしに使える☆ 強い型をOSなしに使える☆ 強い型をOSなしに使える☆ 強い型をOSなしに使える☆ 強い型をOSなしに使える
☆ ベアメタルの上でコードを書ける☆ ベアメタルの上でコードを書ける☆ ベアメタルの上でコードを書ける☆ ベアメタルの上でコードを書ける☆ ベアメタルの上でコードを書ける
☆ Linux kernel内のコードを書ける☆ Linux kernel内のコードを書ける☆ Linux kernel内のコードを書ける☆ Linux kernel内のコードを書ける☆ Linux kernel内のコードを書ける
今日のゴール今日のゴール今日のゴール今日のゴール今日のゴール
ATSには既に良いドキュメントがあります。日本
語訳もあります。
ATSには既に良いドキュメントがあります。日本
語訳もあります。
ATSには既に良いドキュメントがあります。日本
語訳もあります。
ATSには既に良いドキュメントがあります。日本
語訳もあります。
ATSには既に良いドキュメントがあります。日本
語訳もあります。
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* Wiki for ATS2
https://github.com/githwxi/ATS-Postiats/wiki
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* Wiki for ATS2
https://github.com/githwxi/ATS-Postiats/wiki
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* Wiki for ATS2
https://github.com/githwxi/ATS-Postiats/wiki
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* Wiki for ATS2
https://github.com/githwxi/ATS-Postiats/wiki
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* Wiki for ATS2
https://github.com/githwxi/ATS-Postiats/wiki
けれどもこれらは初心者に難しい面がありま
す。 今日のゴールは自分自身で"ATSプログラ
ミング入門"を読めるようになることです。
けれどもこれらは初心者に難しい面がありま
す。 今日のゴールは自分自身で"ATSプログラ
ミング入門"を読めるようになることです。
けれどもこれらは初心者に難しい面がありま
す。 今日のゴールは自分自身で"ATSプログラ
ミング入門"を読めるようになることです。
けれどもこれらは初心者に難しい面がありま
す。 今日のゴールは自分自身で"ATSプログラ
ミング入門"を読めるようになることです。
けれどもこれらは初心者に難しい面がありま
す。 今日のゴールは自分自身で"ATSプログラ
ミング入門"を読めるようになることです。
Hello Worldから始めようHello Worldから始めようHello Worldから始めようHello Worldから始めようHello Worldから始めよう
$ vi helloworld.dats
val () = println! "Hello, world!"
implement main0 () = ()
$ patscc helloworld.dats
$ ./a.out
Hello, world!
$ vi helloworld.dats
val () = println! "Hello, world!"
implement main0 () = ()
$ patscc helloworld.dats
$ ./a.out
Hello, world!
$ vi helloworld.dats
val () = println! "Hello, world!"
implement main0 () = ()
$ patscc helloworld.dats
$ ./a.out
Hello, world!
$ vi helloworld.dats
val () = println! "Hello, world!"
implement main0 () = ()
$ patscc helloworld.dats
$ ./a.out
Hello, world!
$ vi helloworld.dats
val () = println! "Hello, world!"
implement main0 () = ()
$ patscc helloworld.dats
$ ./a.out
Hello, world!
直接 println! を呼び出すこともできます。直接 println! を呼び出すこともできます。直接 println! を呼び出すこともできます。直接 println! を呼び出すこともできます。直接 println! を呼び出すこともできます。
$ vi helloworld2.dats
implement main0 () = () where {
val () = println! "Hello, world!"
}
$ vi helloworld2.dats
implement main0 () = () where {
val () = println! "Hello, world!"
}
$ vi helloworld2.dats
implement main0 () = () where {
val () = println! "Hello, world!"
}
$ vi helloworld2.dats
implement main0 () = () where {
val () = println! "Hello, world!"
}
$ vi helloworld2.dats
implement main0 () = () where {
val () = println! "Hello, world!"
}
もしくはもっとシンプルに...もしくはもっとシンプルに...もしくはもっとシンプルに...もしくはもっとシンプルに...もしくはもっとシンプルに...
$ vi helloworld3.dats
implement main0 () = println! "Hello, world!"
$ vi helloworld3.dats
implement main0 () = println! "Hello, world!"
$ vi helloworld3.dats
implement main0 () = println! "Hello, world!"
$ vi helloworld3.dats
implement main0 () = println! "Hello, world!"
$ vi helloworld3.dats
implement main0 () = println! "Hello, world!"
整数型整数型整数型整数型整数型
"share/atspre_staload.hats" はオーバロー
ドされた演算子のために必要です。
"share/atspre_staload.hats" はオーバロー
ドされた演算子のために必要です。
"share/atspre_staload.hats" はオーバロー
ドされた演算子のために必要です。
"share/atspre_staload.hats" はオーバロー
ドされた演算子のために必要です。
"share/atspre_staload.hats" はオーバロー
ドされた演算子のために必要です。
$ vi int_op.dats
#include "share/atspre_staload.hats"
val () = println! (3 + 4 * 2)
val () = println! ((3 + 4) * 2)
val () = println! (2 - 3)
val () = println! (7 / 2)
val () = println! (7 % 2)
implement main0 () = ()
$ patscc int_op.dats
$ ./a.out
11
14
-1
3
1
$ vi int_op.dats
#include "share/atspre_staload.hats"
val () = println! (3 + 4 * 2)
val () = println! ((3 + 4) * 2)
val () = println! (2 - 3)
val () = println! (7 / 2)
val () = println! (7 % 2)
implement main0 () = ()
$ patscc int_op.dats
$ ./a.out
11
14
-1
3
1
$ vi int_op.dats
#include "share/atspre_staload.hats"
val () = println! (3 + 4 * 2)
val () = println! ((3 + 4) * 2)
val () = println! (2 - 3)
val () = println! (7 / 2)
val () = println! (7 % 2)
implement main0 () = ()
$ patscc int_op.dats
$ ./a.out
11
14
-1
3
1
$ vi int_op.dats
#include "share/atspre_staload.hats"
val () = println! (3 + 4 * 2)
val () = println! ((3 + 4) * 2)
val () = println! (2 - 3)
val () = println! (7 / 2)
val () = println! (7 % 2)
implement main0 () = ()
$ patscc int_op.dats
$ ./a.out
11
14
-1
3
1
$ vi int_op.dats
#include "share/atspre_staload.hats"
val () = println! (3 + 4 * 2)
val () = println! ((3 + 4) * 2)
val () = println! (2 - 3)
val () = println! (7 / 2)
val () = println! (7 % 2)
implement main0 () = ()
$ patscc int_op.dats
$ ./a.out
11
14
-1
3
1
ゼロ除算の検出ゼロ除算の検出ゼロ除算の検出ゼロ除算の検出ゼロ除算の検出
ゼロ除算はコンパイルエラーになります。ゼロ除算はコンパイルエラーになります。ゼロ除算はコンパイルエラーになります。ゼロ除算はコンパイルエラーになります。ゼロ除算はコンパイルエラーになります。
$ vi divmod.dats
#include "share/atspre_staload.hats"
val () = println! (7 / (2 - 2))
implement main0 () = ()
$ patscc divmod.dats
/home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61
(line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main;
S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar
(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
typechecking has failed: there are some unsolved constraints:
please inspect the above reported error message(s) for information.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
$ vi divmod.dats
#include "share/atspre_staload.hats"
val () = println! (7 / (2 - 2))
implement main0 () = ()
$ patscc divmod.dats
/home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61
(line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main;
S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar
(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
typechecking has failed: there are some unsolved constraints:
please inspect the above reported error message(s) for information.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
$ vi divmod.dats
#include "share/atspre_staload.hats"
val () = println! (7 / (2 - 2))
implement main0 () = ()
$ patscc divmod.dats
/home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61
(line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main;
S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar
(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
typechecking has failed: there are some unsolved constraints:
please inspect the above reported error message(s) for information.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
$ vi divmod.dats
#include "share/atspre_staload.hats"
val () = println! (7 / (2 - 2))
implement main0 () = ()
$ patscc divmod.dats
/home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61
(line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main;
S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar
(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
typechecking has failed: there are some unsolved constraints:
please inspect the above reported error message(s) for information.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
$ vi divmod.dats
#include "share/atspre_staload.hats"
val () = println! (7 / (2 - 2))
implement main0 () = ()
$ patscc divmod.dats
/home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61
(line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main;
S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar
(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
typechecking has failed: there are some unsolved constraints:
please inspect the above reported error message(s) for information.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
でもこのエラー、すごく読み難い...でもこのエラー、すごく読み難い...でもこのエラー、すごく読み難い...でもこのエラー、すごく読み難い...でもこのエラー、すごく読み難い...
内部の型表現を理解しよう内部の型表現を理解しよう内部の型表現を理解しよう内部の型表現を理解しよう内部の型表現を理解しよう
次の内部型で表わされたエラーメッセージを解
釈しましょう:
次の内部型で表わされたエラーメッセージを解
釈しましょう:
次の内部型で表わされたエラーメッセージを解
釈しましょう:
次の内部型で表わされたエラーメッセージを解
釈しましょう:
次の内部型で表わされたエラーメッセージを解
釈しましょう:
https://github.com/githwxi/ATS-Postiats/wiki/Internal-types
* S2Eapp - 関数適用の項
* S2Ecst - (例えば int, bool, list などのような) 型定数
* S2Eeff - 関数の作用
* S2Eexi - 存在量化型
* S2Eint - マシン精度整数
* S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます
* S2Evar - (通常、全称量化の)変数
* S2Etop (0; T) - T? を意味する
* S2Etop (1; T) - T?! を意味する
* S2EVar - 型検査器によって導入された(存在量化の)変数
https://github.com/githwxi/ATS-Postiats/wiki/Internal-types
* S2Eapp - 関数適用の項
* S2Ecst - (例えば int, bool, list などのような) 型定数
* S2Eeff - 関数の作用
* S2Eexi - 存在量化型
* S2Eint - マシン精度整数
* S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます
* S2Evar - (通常、全称量化の)変数
* S2Etop (0; T) - T? を意味する
* S2Etop (1; T) - T?! を意味する
* S2EVar - 型検査器によって導入された(存在量化の)変数
https://github.com/githwxi/ATS-Postiats/wiki/Internal-types
* S2Eapp - 関数適用の項
* S2Ecst - (例えば int, bool, list などのような) 型定数
* S2Eeff - 関数の作用
* S2Eexi - 存在量化型
* S2Eint - マシン精度整数
* S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます
* S2Evar - (通常、全称量化の)変数
* S2Etop (0; T) - T? を意味する
* S2Etop (1; T) - T?! を意味する
* S2EVar - 型検査器によって導入された(存在量化の)変数
https://github.com/githwxi/ATS-Postiats/wiki/Internal-types
* S2Eapp - 関数適用の項
* S2Ecst - (例えば int, bool, list などのような) 型定数
* S2Eeff - 関数の作用
* S2Eexi - 存在量化型
* S2Eint - マシン精度整数
* S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます
* S2Evar - (通常、全称量化の)変数
* S2Etop (0; T) - T? を意味する
* S2Etop (1; T) - T?! を意味する
* S2EVar - 型検査器によって導入された(存在量化の)変数
https://github.com/githwxi/ATS-Postiats/wiki/Internal-types
* S2Eapp - 関数適用の項
* S2Ecst - (例えば int, bool, list などのような) 型定数
* S2Eeff - 関数の作用
* S2Eexi - 存在量化型
* S2Eint - マシン精度整数
* S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます
* S2Evar - (通常、全称量化の)変数
* S2Etop (0; T) - T? を意味する
* S2Etop (1; T) - T?! を意味する
* S2EVar - 型検査器によって導入された(存在量化の)変数
ゼロ除算の意味は...ゼロ除算の意味は...ゼロ除算の意味は...ゼロ除算の意味は...ゼロ除算の意味は...
unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar
(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)),
S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
↓ つまり...
命題 "2 - 2 != 0" が解決できない、と言っている
unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar
(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)),
S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
↓ つまり...
命題 "2 - 2 != 0" が解決できない、と言っている
unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar
(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)),
S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
↓ つまり...
命題 "2 - 2 != 0" が解決できない、と言っている
unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar
(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)),
S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
↓ つまり...
命題 "2 - 2 != 0" が解決できない、と言っている
unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar
(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)),
S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0)))
↓ つまり...
命題 "2 - 2 != 0" が解決できない、と言っている
これは依存型の力によっていて、ATS言語の
preludeライブラリで使われています。
これは依存型の力によっていて、ATS言語の
preludeライブラリで使われています。
これは依存型の力によっていて、ATS言語の
preludeライブラリで使われています。
これは依存型の力によっていて、ATS言語の
preludeライブラリで使われています。
これは依存型の力によっていて、ATS言語の
preludeライブラリで使われています。
$ vi ATS-Postiats/prelude/SATS/integer.sats
typedef
g1int_div_type
(tk:tk) =
{i,j:int | j != 0}
(g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk)
--snip--
fun g1int_div_int : g1int_div_type (intknd) = "mac#%"
fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%"
fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%"
fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%"
$ vi ATS-Postiats/prelude/SATS/integer.sats
typedef
g1int_div_type
(tk:tk) =
{i,j:int | j != 0}
(g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk)
--snip--
fun g1int_div_int : g1int_div_type (intknd) = "mac#%"
fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%"
fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%"
fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%"
$ vi ATS-Postiats/prelude/SATS/integer.sats
typedef
g1int_div_type
(tk:tk) =
{i,j:int | j != 0}
(g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk)
--snip--
fun g1int_div_int : g1int_div_type (intknd) = "mac#%"
fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%"
fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%"
fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%"
$ vi ATS-Postiats/prelude/SATS/integer.sats
typedef
g1int_div_type
(tk:tk) =
{i,j:int | j != 0}
(g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk)
--snip--
fun g1int_div_int : g1int_div_type (intknd) = "mac#%"
fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%"
fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%"
fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%"
$ vi ATS-Postiats/prelude/SATS/integer.sats
typedef
g1int_div_type
(tk:tk) =
{i,j:int | j != 0}
(g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk)
--snip--
fun g1int_div_int : g1int_div_type (intknd) = "mac#%"
fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%"
fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%"
fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%"
実数型実数型実数型実数型実数型
$ vi double_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3.0 + 5.0) * 8.0 / 3.0)
implement main0 () = ()
$ patscc double_op.dats
$ ./a.out
21.333333
$ vi double_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3.0 + 5.0) * 8.0 / 3.0)
implement main0 () = ()
$ patscc double_op.dats
$ ./a.out
21.333333
$ vi double_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3.0 + 5.0) * 8.0 / 3.0)
implement main0 () = ()
$ patscc double_op.dats
$ ./a.out
21.333333
$ vi double_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3.0 + 5.0) * 8.0 / 3.0)
implement main0 () = ()
$ patscc double_op.dats
$ ./a.out
21.333333
$ vi double_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3.0 + 5.0) * 8.0 / 3.0)
implement main0 () = ()
$ patscc double_op.dats
$ ./a.out
21.333333
演算子はオーバーロードされています。演算子はオーバーロードされています。演算子はオーバーロードされています。演算子はオーバーロードされています。演算子はオーバーロードされています。
$ vi double_int_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3 + 5.0) * 8 / 3.0)
implement main0 () = ()
$ patscc double_int_op.dats
$ ./a.out
21.333333
$ vi double_int_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3 + 5.0) * 8 / 3.0)
implement main0 () = ()
$ patscc double_int_op.dats
$ ./a.out
21.333333
$ vi double_int_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3 + 5.0) * 8 / 3.0)
implement main0 () = ()
$ patscc double_int_op.dats
$ ./a.out
21.333333
$ vi double_int_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3 + 5.0) * 8 / 3.0)
implement main0 () = ()
$ patscc double_int_op.dats
$ ./a.out
21.333333
$ vi double_int_op.dats
#include "share/atspre_staload.hats"
val () = println! ((3 + 5.0) * 8 / 3.0)
implement main0 () = ()
$ patscc double_int_op.dats
$ ./a.out
21.333333
真偽値真偽値真偽値真偽値真偽値
trueとfalseが真偽値です。trueとfalseが真偽値です。trueとfalseが真偽値です。trueとfalseが真偽値です。trueとfalseが真偽値です。
$ vi bool_op.dats
#include "share/atspre_staload.hats"
val () = println! (true && false)
val () = println! (not (false || not false && not false))
val () = println! (2 < 3)
val () = println! (2 < 3 && 2.0 >= 3.0)
val () = println! (2 < 3 || 2.0 = 3.0)
val () = println! (not (3 < 2))
implement main0 () = ()
$ patscc bool_op.dats
$ ./a.out
false
false
true
false
true
true
$ vi bool_op.dats
#include "share/atspre_staload.hats"
val () = println! (true && false)
val () = println! (not (false || not false && not false))
val () = println! (2 < 3)
val () = println! (2 < 3 && 2.0 >= 3.0)
val () = println! (2 < 3 || 2.0 = 3.0)
val () = println! (not (3 < 2))
implement main0 () = ()
$ patscc bool_op.dats
$ ./a.out
false
false
true
false
true
true
$ vi bool_op.dats
#include "share/atspre_staload.hats"
val () = println! (true && false)
val () = println! (not (false || not false && not false))
val () = println! (2 < 3)
val () = println! (2 < 3 && 2.0 >= 3.0)
val () = println! (2 < 3 || 2.0 = 3.0)
val () = println! (not (3 < 2))
implement main0 () = ()
$ patscc bool_op.dats
$ ./a.out
false
false
true
false
true
true
$ vi bool_op.dats
#include "share/atspre_staload.hats"
val () = println! (true && false)
val () = println! (not (false || not false && not false))
val () = println! (2 < 3)
val () = println! (2 < 3 && 2.0 >= 3.0)
val () = println! (2 < 3 || 2.0 = 3.0)
val () = println! (not (3 < 2))
implement main0 () = ()
$ patscc bool_op.dats
$ ./a.out
false
false
true
false
true
true
$ vi bool_op.dats
#include "share/atspre_staload.hats"
val () = println! (true && false)
val () = println! (not (false || not false && not false))
val () = println! (2 < 3)
val () = println! (2 < 3 && 2.0 >= 3.0)
val () = println! (2 < 3 || 2.0 = 3.0)
val () = println! (not (3 < 2))
implement main0 () = ()
$ patscc bool_op.dats
$ ./a.out
false
false
true
false
true
true
定数定義定数定義定数定義定数定義定数定義
valキーワードを使って定数を定義できます。valキーワードを使って定数を定義できます。valキーワードを使って定数を定義できます。valキーワードを使って定数を定義できます。valキーワードを使って定数を定義できます。
$ vi val_overwrite.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = 1
val b = a
val () = println! a
val () = println! b
val a = 2
val () = println! a
val () = println! b
}
$ patscc val_overwrite.dats
$ ./a.out
1
1
2
1
$ vi val_overwrite.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = 1
val b = a
val () = println! a
val () = println! b
val a = 2
val () = println! a
val () = println! b
}
$ patscc val_overwrite.dats
$ ./a.out
1
1
2
1
$ vi val_overwrite.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = 1
val b = a
val () = println! a
val () = println! b
val a = 2
val () = println! a
val () = println! b
}
$ patscc val_overwrite.dats
$ ./a.out
1
1
2
1
$ vi val_overwrite.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = 1
val b = a
val () = println! a
val () = println! b
val a = 2
val () = println! a
val () = println! b
}
$ patscc val_overwrite.dats
$ ./a.out
1
1
2
1
$ vi val_overwrite.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = 1
val b = a
val () = println! a
val () = println! b
val a = 2
val () = println! a
val () = println! b
}
$ patscc val_overwrite.dats
$ ./a.out
1
1
2
1
関数定義関数定義関数定義関数定義関数定義
funキーワードを使って関数を定義できます。funキーワードを使って関数を定義できます。funキーワードを使って関数を定義できます。funキーワードを使って関数を定義できます。funキーワードを使って関数を定義できます。
$ vi two_arguments.dats
#include "share/atspre_staload.hats"
fun g (x:int, y:int): int = x * x + y * y - 4
implement main0 () = println! (g (3, 2))
$ patscc two_arguments.dats
$ ./a.out
9
$ vi two_arguments.dats
#include "share/atspre_staload.hats"
fun g (x:int, y:int): int = x * x + y * y - 4
implement main0 () = println! (g (3, 2))
$ patscc two_arguments.dats
$ ./a.out
9
$ vi two_arguments.dats
#include "share/atspre_staload.hats"
fun g (x:int, y:int): int = x * x + y * y - 4
implement main0 () = println! (g (3, 2))
$ patscc two_arguments.dats
$ ./a.out
9
$ vi two_arguments.dats
#include "share/atspre_staload.hats"
fun g (x:int, y:int): int = x * x + y * y - 4
implement main0 () = println! (g (3, 2))
$ patscc two_arguments.dats
$ ./a.out
9
$ vi two_arguments.dats
#include "share/atspre_staload.hats"
fun g (x:int, y:int): int = x * x + y * y - 4
implement main0 () = println! (g (3, 2))
$ patscc two_arguments.dats
$ ./a.out
9
型検査型検査型検査型検査型検査
$ vi f_takes_double.dats
#include "share/atspre_staload.hats"
fun f (x:int): int = 3 * x
implement main0 () = {
val r = f 4.0
val () = println! r
}
$ patscc f_takes_double.dats
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): the dynamic expression cannot be
assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))].
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): mismatch of static terms (tyleq):
The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst
(double_kind))
The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))
$ vi f_takes_double.dats
#include "share/atspre_staload.hats"
fun f (x:int): int = 3 * x
implement main0 () = {
val r = f 4.0
val () = println! r
}
$ patscc f_takes_double.dats
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): the dynamic expression cannot be
assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))].
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): mismatch of static terms (tyleq):
The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst
(double_kind))
The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))
$ vi f_takes_double.dats
#include "share/atspre_staload.hats"
fun f (x:int): int = 3 * x
implement main0 () = {
val r = f 4.0
val () = println! r
}
$ patscc f_takes_double.dats
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): the dynamic expression cannot be
assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))].
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): mismatch of static terms (tyleq):
The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst
(double_kind))
The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))
$ vi f_takes_double.dats
#include "share/atspre_staload.hats"
fun f (x:int): int = 3 * x
implement main0 () = {
val r = f 4.0
val () = println! r
}
$ patscc f_takes_double.dats
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): the dynamic expression cannot be
assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))].
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): mismatch of static terms (tyleq):
The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst
(double_kind))
The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))
$ vi f_takes_double.dats
#include "share/atspre_staload.hats"
fun f (x:int): int = 3 * x
implement main0 () = {
val r = f 4.0
val () = println! r
}
$ patscc f_takes_double.dats
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): the dynamic expression cannot be
assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))].
/home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) --
106(line=6, offs=17): error(3): mismatch of static terms (tyleq):
The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst
(double_kind))
The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))
関数 "f" はint型の値を取るべきでした。関数 "f" はint型の値を取るべきでした。関数 "f" はint型の値を取るべきでした。関数 "f" はint型の値を取るべきでした。関数 "f" はint型の値を取るべきでした。
条件分岐条件分岐条件分岐条件分岐条件分岐
if then elseキーワードが使えます。if then elseキーワードが使えます。if then elseキーワードが使えます。if then elseキーワードが使えます。if then elseキーワードが使えます。
$ vi if_then_else.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = if 1 < 2 then 3 else 4
val () = println! (a:int)
}
$ patscc if_then_else.dats
$ ./a.out
3
$ vi if_then_else.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = if 1 < 2 then 3 else 4
val () = println! (a:int)
}
$ patscc if_then_else.dats
$ ./a.out
3
$ vi if_then_else.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = if 1 < 2 then 3 else 4
val () = println! (a:int)
}
$ patscc if_then_else.dats
$ ./a.out
3
$ vi if_then_else.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = if 1 < 2 then 3 else 4
val () = println! (a:int)
}
$ patscc if_then_else.dats
$ ./a.out
3
$ vi if_then_else.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val a = if 1 < 2 then 3 else 4
val () = println! (a:int)
}
$ patscc if_then_else.dats
$ ./a.out
3
else節は省略できますelse節は省略できますelse節は省略できますelse節は省略できますelse節は省略できます
else節の型がvoidであれば省略できます。else節の型がvoidであれば省略できます。else節の型がvoidであれば省略できます。else節の型がvoidであれば省略できます。else節の型がvoidであれば省略できます。
$ vi println_expr.dats
#include "share/atspre_staload.hats"
implement main0 () = if 7 > 5 then println! "It's true."
$ patscc println_expr.dats
$ ./a.out
It's true.
$ vi println_expr.dats
#include "share/atspre_staload.hats"
implement main0 () = if 7 > 5 then println! "It's true."
$ patscc println_expr.dats
$ ./a.out
It's true.
$ vi println_expr.dats
#include "share/atspre_staload.hats"
implement main0 () = if 7 > 5 then println! "It's true."
$ patscc println_expr.dats
$ ./a.out
It's true.
$ vi println_expr.dats
#include "share/atspre_staload.hats"
implement main0 () = if 7 > 5 then println! "It's true."
$ patscc println_expr.dats
$ ./a.out
It's true.
$ vi println_expr.dats
#include "share/atspre_staload.hats"
implement main0 () = if 7 > 5 then println! "It's true."
$ patscc println_expr.dats
$ ./a.out
It's true.
型を表示するには$showtype型を表示するには$showtype型を表示するには$showtype型を表示するには$showtype型を表示するには$showtype
$showtypeキーワードに任意の値を渡すと、コ
ンパイル時にその型を表示してくれます。
$showtypeキーワードに任意の値を渡すと、コ
ンパイル時にその型を表示してくれます。
$showtypeキーワードに任意の値を渡すと、コ
ンパイル時にその型を表示してくれます。
$showtypeキーワードに任意の値を渡すと、コ
ンパイル時にその型を表示してくれます。
$showtypeキーワードに任意の値を渡すと、コ
ンパイル時にその型を表示してくれます。
$ vi showtype_int.dats
val () = println! 3
val _ = $showtype 3
implement main0 () = ()
$ patscc showtype_int.dats
**SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39
(line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst
(g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas
(S2RTBASimp(1; t@ype))
$ ./a.out
3
$ vi showtype_int.dats
val () = println! 3
val _ = $showtype 3
implement main0 () = ()
$ patscc showtype_int.dats
**SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39
(line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst
(g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas
(S2RTBASimp(1; t@ype))
$ ./a.out
3
$ vi showtype_int.dats
val () = println! 3
val _ = $showtype 3
implement main0 () = ()
$ patscc showtype_int.dats
**SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39
(line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst
(g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas
(S2RTBASimp(1; t@ype))
$ ./a.out
3
$ vi showtype_int.dats
val () = println! 3
val _ = $showtype 3
implement main0 () = ()
$ patscc showtype_int.dats
**SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39
(line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst
(g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas
(S2RTBASimp(1; t@ype))
$ ./a.out
3
$ vi showtype_int.dats
val () = println! 3
val _ = $showtype 3
implement main0 () = ()
$ patscc showtype_int.dats
**SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39
(line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst
(g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas
(S2RTBASimp(1; t@ype))
$ ./a.out
3
不変の文字列不変の文字列不変の文字列不変の文字列不変の文字列
"foo"は不変の文字列のリテラルです。"foo"は不変の文字列のリテラルです。"foo"は不変の文字列のリテラルです。"foo"は不変の文字列のリテラルです。"foo"は不変の文字列のリテラルです。
$ vi print_foo.dats
#include "share/atspre_staload.hats"
val () = println! "foo"
implement main0 () = ()
$ patscc print_foo.dats
$ ./a.out
foo
$ vi print_foo.dats
#include "share/atspre_staload.hats"
val () = println! "foo"
implement main0 () = ()
$ patscc print_foo.dats
$ ./a.out
foo
$ vi print_foo.dats
#include "share/atspre_staload.hats"
val () = println! "foo"
implement main0 () = ()
$ patscc print_foo.dats
$ ./a.out
foo
$ vi print_foo.dats
#include "share/atspre_staload.hats"
val () = println! "foo"
implement main0 () = ()
$ patscc print_foo.dats
$ ./a.out
foo
$ vi print_foo.dats
#include "share/atspre_staload.hats"
val () = println! "foo"
implement main0 () = ()
$ patscc print_foo.dats
$ ./a.out
foo
けれども、不変の文字列では連結や逆順のよ
うな操作を使えません。
けれども、不変の文字列では連結や逆順のよ
うな操作を使えません。
けれども、不変の文字列では連結や逆順のよ
うな操作を使えません。
けれども、不変の文字列では連結や逆順のよ
うな操作を使えません。
けれども、不変の文字列では連結や逆順のよ
うな操作を使えません。
可変の文字列を使ってみよう可変の文字列を使ってみよう可変の文字列を使ってみよう可変の文字列を使ってみよう可変の文字列を使ってみよう
2つの不変の文字列を連結してみましょう。2つの不変の文字列を連結してみましょう。2つの不変の文字列を連結してみましょう。2つの不変の文字列を連結してみましょう。2つの不変の文字列を連結してみましょう。
$ vi try_string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
}
$ patscc try_string_append.dats
/home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135
(line=6, offs=2): error(3): the linear dynamic variable [s3$3509
(-1)] needs to be consumed but it is preserved with the type
[S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead.
patsopt(TRANS3): there are [1] errors in total.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
$ vi try_string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
}
$ patscc try_string_append.dats
/home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135
(line=6, offs=2): error(3): the linear dynamic variable [s3$3509
(-1)] needs to be consumed but it is preserved with the type
[S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead.
patsopt(TRANS3): there are [1] errors in total.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
$ vi try_string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
}
$ patscc try_string_append.dats
/home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135
(line=6, offs=2): error(3): the linear dynamic variable [s3$3509
(-1)] needs to be consumed but it is preserved with the type
[S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead.
patsopt(TRANS3): there are [1] errors in total.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
$ vi try_string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
}
$ patscc try_string_append.dats
/home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135
(line=6, offs=2): error(3): the linear dynamic variable [s3$3509
(-1)] needs to be consumed but it is preserved with the type
[S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead.
patsopt(TRANS3): there are [1] errors in total.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
$ vi try_string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
}
$ patscc try_string_append.dats
/home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135
(line=6, offs=2): error(3): the linear dynamic variable [s3$3509
(-1)] needs to be consumed but it is preserved with the type
[S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead.
patsopt(TRANS3): there are [1] errors in total.
exit(ATS): uncaught exception:
_2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE
rrorExn(1025)
なぜエラーになったのでしょうか?なぜエラーになったのでしょうか?なぜエラーになったのでしょうか?なぜエラーになったのでしょうか?なぜエラーになったのでしょうか?
可変の文字列はfreeする必要がある可変の文字列はfreeする必要がある可変の文字列はfreeする必要がある可変の文字列はfreeする必要がある可変の文字列はfreeする必要がある
連結で生成した可変の文字列をfreeし忘れて
いました。
連結で生成した可変の文字列をfreeし忘れて
いました。
連結で生成した可変の文字列をfreeし忘れて
いました。
連結で生成した可変の文字列をfreeし忘れて
いました。
連結で生成した可変の文字列をfreeし忘れて
いました。
$ vi string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
val () = free s3
}
$ patscc string_append.dats -DATS_MEMALLOC_LIBC
$ ./a.out
YokohamaStation
$ vi string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
val () = free s3
}
$ patscc string_append.dats -DATS_MEMALLOC_LIBC
$ ./a.out
YokohamaStation
$ vi string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
val () = free s3
}
$ patscc string_append.dats -DATS_MEMALLOC_LIBC
$ ./a.out
YokohamaStation
$ vi string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
val () = free s3
}
$ patscc string_append.dats -DATS_MEMALLOC_LIBC
$ ./a.out
YokohamaStation
$ vi string_append.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val s3 = string_append ("Yokohama", "Station")
val () = println! s3
val () = free s3
}
$ patscc string_append.dats -DATS_MEMALLOC_LIBC
$ ./a.out
YokohamaStation
"ATS_MEMALLOC_LIBC"フラグはlibcの
mallocを使うために必要です。 どうやって
ATS2はfree忘れを検出したのでしょうか?
"ATS_MEMALLOC_LIBC"フラグはlibcの
mallocを使うために必要です。 どうやって
ATS2はfree忘れを検出したのでしょうか?
"ATS_MEMALLOC_LIBC"フラグはlibcの
mallocを使うために必要です。 どうやって
ATS2はfree忘れを検出したのでしょうか?
"ATS_MEMALLOC_LIBC"フラグはlibcの
mallocを使うために必要です。 どうやって
ATS2はfree忘れを検出したのでしょうか?
"ATS_MEMALLOC_LIBC"フラグはlibcの
mallocを使うために必要です。 どうやって
ATS2はfree忘れを検出したのでしょうか?
線形型はリソースを監視する線形型はリソースを監視する線形型はリソースを監視する線形型はリソースを監視する線形型はリソースを監視する
可変の文字列(strptr型)を消費し忘れるとコン
パイルエラーです。
可変の文字列(strptr型)を消費し忘れるとコン
パイルエラーです。
可変の文字列(strptr型)を消費し忘れるとコン
パイルエラーです。
可変の文字列(strptr型)を消費し忘れるとコン
パイルエラーです。
可変の文字列(strptr型)を消費し忘れるとコン
パイルエラーです。
リストの型リストの型リストの型リストの型リストの型
リスト(list_vt型)は下図のような構造です。リスト(list_vt型)は下図のような構造です。リスト(list_vt型)は下図のような構造です。リスト(list_vt型)は下図のような構造です。リスト(list_vt型)は下図のような構造です。
リストの生成リストの生成リストの生成リストの生成リストの生成
list_vt_make_pair (A, B)はAとBを要素に持
つリストを生成します。
list_vt_make_pair (A, B)はAとBを要素に持
つリストを生成します。
list_vt_make_pair (A, B)はAとBを要素に持
つリストを生成します。
list_vt_make_pair (A, B)はAとBを要素に持
つリストを生成します。
list_vt_make_pair (A, B)はAとBを要素に持
つリストを生成します。
$ vi make_pair.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l = list_vt_make_pair (1, 2)
val () = print_list_vt<int> l
val () = list_vt_free<int> l
}
$ patscc make_pair.dats -DATS_MEMALLOC_LIBC
$ ./a.out
1, 2
$ vi make_pair.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l = list_vt_make_pair (1, 2)
val () = print_list_vt<int> l
val () = list_vt_free<int> l
}
$ patscc make_pair.dats -DATS_MEMALLOC_LIBC
$ ./a.out
1, 2
$ vi make_pair.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l = list_vt_make_pair (1, 2)
val () = print_list_vt<int> l
val () = list_vt_free<int> l
}
$ patscc make_pair.dats -DATS_MEMALLOC_LIBC
$ ./a.out
1, 2
$ vi make_pair.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l = list_vt_make_pair (1, 2)
val () = print_list_vt<int> l
val () = list_vt_free<int> l
}
$ patscc make_pair.dats -DATS_MEMALLOC_LIBC
$ ./a.out
1, 2
$ vi make_pair.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l = list_vt_make_pair (1, 2)
val () = print_list_vt<int> l
val () = list_vt_free<int> l
}
$ patscc make_pair.dats -DATS_MEMALLOC_LIBC
$ ./a.out
1, 2
テンプレート関数を使うために "<int>" が必要
です。
テンプレート関数を使うために "<int>" が必要
です。
テンプレート関数を使うために "<int>" が必要
です。
テンプレート関数を使うために "<int>" が必要
です。
テンプレート関数を使うために "<int>" が必要
です。
リストの生成を図でリストの生成を図でリストの生成を図でリストの生成を図でリストの生成を図で
リストの連結リストの連結リストの連結リストの連結リストの連結
list_vt_append (L1, L2)はリストL1とL2を消
費して、それらを連結した新しいリストを生成し
ます。
list_vt_append (L1, L2)はリストL1とL2を消
費して、それらを連結した新しいリストを生成し
ます。
list_vt_append (L1, L2)はリストL1とL2を消
費して、それらを連結した新しいリストを生成し
ます。
list_vt_append (L1, L2)はリストL1とL2を消
費して、それらを連結した新しいリストを生成し
ます。
list_vt_append (L1, L2)はリストL1とL2を消
費して、それらを連結した新しいリストを生成し
ます。
$ vi append_list.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l1 = list_vt_make_pair (1, 2)
val l2 = list_vt_make_sing 3
val l3 = list_vt_append (l2, l1)
val () = print_list_vt<int> l3
val () = list_vt_free<int> l3
}
$ patscc append_list.dats -DATS_MEMALLOC_LIBC
$ ./a.out
3, 1, 2
$ vi append_list.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l1 = list_vt_make_pair (1, 2)
val l2 = list_vt_make_sing 3
val l3 = list_vt_append (l2, l1)
val () = print_list_vt<int> l3
val () = list_vt_free<int> l3
}
$ patscc append_list.dats -DATS_MEMALLOC_LIBC
$ ./a.out
3, 1, 2
$ vi append_list.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l1 = list_vt_make_pair (1, 2)
val l2 = list_vt_make_sing 3
val l3 = list_vt_append (l2, l1)
val () = print_list_vt<int> l3
val () = list_vt_free<int> l3
}
$ patscc append_list.dats -DATS_MEMALLOC_LIBC
$ ./a.out
3, 1, 2
$ vi append_list.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l1 = list_vt_make_pair (1, 2)
val l2 = list_vt_make_sing 3
val l3 = list_vt_append (l2, l1)
val () = print_list_vt<int> l3
val () = list_vt_free<int> l3
}
$ patscc append_list.dats -DATS_MEMALLOC_LIBC
$ ./a.out
3, 1, 2
$ vi append_list.dats
#include "share/atspre_staload.hats"
implement main0 () = {
val l1 = list_vt_make_pair (1, 2)
val l2 = list_vt_make_sing 3
val l3 = list_vt_append (l2, l1)
val () = print_list_vt<int> l3
val () = list_vt_free<int> l3
}
$ patscc append_list.dats -DATS_MEMALLOC_LIBC
$ ./a.out
3, 1, 2
リストの連結を図でリストの連結を図でリストの連結を図でリストの連結を図でリストの連結を図で
Japan ATS User GroupどうですかJapan ATS User GroupどうですかJapan ATS User GroupどうですかJapan ATS User GroupどうですかJapan ATS User Groupどうですか
日本語でATSに関する情報交換をするグルー
プJapan ATS User Group (JATS-UG)があ
ります。 現在の主な活動はATS関連ドキュメン
トの日本語翻訳です。
日本語でATSに関する情報交換をするグルー
プJapan ATS User Group (JATS-UG)があ
ります。 現在の主な活動はATS関連ドキュメン
トの日本語翻訳です。
日本語でATSに関する情報交換をするグルー
プJapan ATS User Group (JATS-UG)があ
ります。 現在の主な活動はATS関連ドキュメン
トの日本語翻訳です。
日本語でATSに関する情報交換をするグルー
プJapan ATS User Group (JATS-UG)があ
ります。 現在の主な活動はATS関連ドキュメン
トの日本語翻訳です。
日本語でATSに関する情報交換をするグルー
プJapan ATS User Group (JATS-UG)があ
ります。 現在の主な活動はATS関連ドキュメン
トの日本語翻訳です。
http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/
入会にあたって特に規則などはありません。
「オレはJATS-UGメンバーだぜ」 と言ったその
日からあなたもメンバーです!
入会にあたって特に規則などはありません。
「オレはJATS-UGメンバーだぜ」 と言ったその
日からあなたもメンバーです!
入会にあたって特に規則などはありません。
「オレはJATS-UGメンバーだぜ」 と言ったその
日からあなたもメンバーです!
入会にあたって特に規則などはありません。
「オレはJATS-UGメンバーだぜ」 と言ったその
日からあなたもメンバーです!
入会にあたって特に規則などはありません。
「オレはJATS-UGメンバーだぜ」 と言ったその
日からあなたもメンバーです!

More Related Content

What's hot

中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方
広平 田村
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
ワタナベ難読化シェル芸
ワタナベ難読化シェル芸ワタナベ難読化シェル芸
ワタナベ難読化シェル芸
xztaityozx
 
Lockfree Queue
Lockfree QueueLockfree Queue
Lockfree Queue
Kumazaki Hiroki
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
 
セキュリティ未経験だったけど入社1年目から Bug Bounty Program 運営に参加してみた
セキュリティ未経験だったけど入社1年目から Bug Bounty Program 運営に参加してみたセキュリティ未経験だったけど入社1年目から Bug Bounty Program 運営に参加してみた
セキュリティ未経験だったけど入社1年目から Bug Bounty Program 運営に参加してみた
LINE Corporation
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API
Taku Miyakawa
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
信之 岩永
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
 
ハッカー入門 公開鍵で学ぶ、ものごとの裏側を考える技術 (Qiita Conference 2022登壇資料).pdf
ハッカー入門 公開鍵で学ぶ、ものごとの裏側を考える技術 (Qiita Conference 2022登壇資料).pdfハッカー入門 公開鍵で学ぶ、ものごとの裏側を考える技術 (Qiita Conference 2022登壇資料).pdf
ハッカー入門 公開鍵で学ぶ、ものごとの裏側を考える技術 (Qiita Conference 2022登壇資料).pdf
Yuichiro Smith
 
Webアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかHiroshi Tokumaru
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
エンジニアという仕事を楽しみ続けるためのキャリア戦略
エンジニアという仕事を楽しみ続けるためのキャリア戦略エンジニアという仕事を楽しみ続けるためのキャリア戦略
エンジニアという仕事を楽しみ続けるためのキャリア戦略
Shuichi Tsutsumi
 
最速C# 7.x
最速C# 7.x最速C# 7.x
最速C# 7.x
Yamamoto Reki
 

What's hot (20)

中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
ワタナベ難読化シェル芸
ワタナベ難読化シェル芸ワタナベ難読化シェル芸
ワタナベ難読化シェル芸
 
Lockfree Queue
Lockfree QueueLockfree Queue
Lockfree Queue
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
セキュリティ未経験だったけど入社1年目から Bug Bounty Program 運営に参加してみた
セキュリティ未経験だったけど入社1年目から Bug Bounty Program 運営に参加してみたセキュリティ未経験だったけど入社1年目から Bug Bounty Program 運営に参加してみた
セキュリティ未経験だったけど入社1年目から Bug Bounty Program 運営に参加してみた
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
ハッカー入門 公開鍵で学ぶ、ものごとの裏側を考える技術 (Qiita Conference 2022登壇資料).pdf
ハッカー入門 公開鍵で学ぶ、ものごとの裏側を考える技術 (Qiita Conference 2022登壇資料).pdfハッカー入門 公開鍵で学ぶ、ものごとの裏側を考える技術 (Qiita Conference 2022登壇資料).pdf
ハッカー入門 公開鍵で学ぶ、ものごとの裏側を考える技術 (Qiita Conference 2022登壇資料).pdf
 
Webアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいか
 
Map
MapMap
Map
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
エンジニアという仕事を楽しみ続けるためのキャリア戦略
エンジニアという仕事を楽しみ続けるためのキャリア戦略エンジニアという仕事を楽しみ続けるためのキャリア戦略
エンジニアという仕事を楽しみ続けるためのキャリア戦略
 
最速C# 7.x
最速C# 7.x最速C# 7.x
最速C# 7.x
 

Viewers also liked

ATS programming on ESP8266
ATS programming on ESP8266ATS programming on ESP8266
ATS programming on ESP8266
Kiwamu Okabe
 
Metasepi team meeting #17: Invariant captured by ATS's API
Metasepi team meeting #17: Invariant captured by ATS's APIMetasepi team meeting #17: Invariant captured by ATS's API
Metasepi team meeting #17: Invariant captured by ATS's API
Kiwamu Okabe
 
Metasepi team meeting #14: ATS programming on MCU
Metasepi team meeting #14: ATS programming on MCUMetasepi team meeting #14: ATS programming on MCU
Metasepi team meeting #14: ATS programming on MCU
Kiwamu Okabe
 
ATS Programming Tutorial
ATS Programming TutorialATS Programming Tutorial
ATS Programming Tutorial
Kiwamu Okabe
 
ATS language overview'
ATS language overview'ATS language overview'
ATS language overview'
Kiwamu Okabe
 
Real-time OS system state captured by ATS language
Real-time OS system state captured by ATS languageReal-time OS system state captured by ATS language
Real-time OS system state captured by ATS language
Kiwamu Okabe
 
Start! ATS programming
Start! ATS programmingStart! ATS programming
Start! ATS programmingKiwamu Okabe
 
Metasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoMetasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on Arduino
Kiwamu Okabe
 
Arduino programming of ML-style in ATS
Arduino programming of ML-style in ATSArduino programming of ML-style in ATS
Arduino programming of ML-style in ATS
Kiwamu Okabe
 
ATS language overview
ATS language overviewATS language overview
ATS language overview
Kiwamu Okabe
 
Embedded application designed by ATS language
Embedded application designed by ATS languageEmbedded application designed by ATS language
Embedded application designed by ATS language
Kiwamu Okabe
 
Static typing and proof in ATS language
Static typing and proof in ATS languageStatic typing and proof in ATS language
Static typing and proof in ATS language
Kiwamu Okabe
 
Metasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCUMetasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCU
Kiwamu Okabe
 
ATS/LF for Coq users
ATS/LF for Coq usersATS/LF for Coq users
ATS/LF for Coq users
Kiwamu Okabe
 
Metasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCU
Kiwamu Okabe
 

Viewers also liked (15)

ATS programming on ESP8266
ATS programming on ESP8266ATS programming on ESP8266
ATS programming on ESP8266
 
Metasepi team meeting #17: Invariant captured by ATS's API
Metasepi team meeting #17: Invariant captured by ATS's APIMetasepi team meeting #17: Invariant captured by ATS's API
Metasepi team meeting #17: Invariant captured by ATS's API
 
Metasepi team meeting #14: ATS programming on MCU
Metasepi team meeting #14: ATS programming on MCUMetasepi team meeting #14: ATS programming on MCU
Metasepi team meeting #14: ATS programming on MCU
 
ATS Programming Tutorial
ATS Programming TutorialATS Programming Tutorial
ATS Programming Tutorial
 
ATS language overview'
ATS language overview'ATS language overview'
ATS language overview'
 
Real-time OS system state captured by ATS language
Real-time OS system state captured by ATS languageReal-time OS system state captured by ATS language
Real-time OS system state captured by ATS language
 
Start! ATS programming
Start! ATS programmingStart! ATS programming
Start! ATS programming
 
Metasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoMetasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on Arduino
 
Arduino programming of ML-style in ATS
Arduino programming of ML-style in ATSArduino programming of ML-style in ATS
Arduino programming of ML-style in ATS
 
ATS language overview
ATS language overviewATS language overview
ATS language overview
 
Embedded application designed by ATS language
Embedded application designed by ATS languageEmbedded application designed by ATS language
Embedded application designed by ATS language
 
Static typing and proof in ATS language
Static typing and proof in ATS languageStatic typing and proof in ATS language
Static typing and proof in ATS language
 
Metasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCUMetasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCU
 
ATS/LF for Coq users
ATS/LF for Coq usersATS/LF for Coq users
ATS/LF for Coq users
 
Metasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCU
 

Similar to ATSプログラミングチュートリアル

Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
Kiwamu Okabe
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
 
Perl勉強会#2資料
Perl勉強会#2資料Perl勉強会#2資料
Perl勉強会#2資料
Kiyo Tsunezumi
 
Start printf 6_takarakasai
Start printf 6_takarakasaiStart printf 6_takarakasai
Start printf 6_takarakasai
takara kasai
 
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Arata Fujimura
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
Kiwamu Okabe
 
Kobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテルKobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテル
tnoda
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
Introduction to Initramfs - Initramfs-tools and Dracut
Introduction to Initramfs - Initramfs-tools and DracutIntroduction to Initramfs - Initramfs-tools and Dracut
Introduction to Initramfs - Initramfs-tools and Dracut
Taisuke Yamada
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistranokumachang_LL
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺちdo_aki
 
zsh とわたし
zsh とわたし zsh とわたし
zsh とわたし
Toshihiko Shimokawa
 
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
mametter
 
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
Isaac Mathis
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
Toshio Ehara
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013純生 野田
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回Yuma Yoshimoto
 

Similar to ATSプログラミングチュートリアル (20)

Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 
Perl勉強会#2資料
Perl勉強会#2資料Perl勉強会#2資料
Perl勉強会#2資料
 
Start printf 6_takarakasai
Start printf 6_takarakasaiStart printf 6_takarakasai
Start printf 6_takarakasai
 
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
Kobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテルKobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテル
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
Introduction to Initramfs - Initramfs-tools and Dracut
Introduction to Initramfs - Initramfs-tools and DracutIntroduction to Initramfs - Initramfs-tools and Dracut
Introduction to Initramfs - Initramfs-tools and Dracut
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
 
zsh とわたし
zsh とわたし zsh とわたし
zsh とわたし
 
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
 
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回
 

Recently uploaded

論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 

Recently uploaded (16)

論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 

ATSプログラミングチュートリアル

  • 2. 準備はできましたか?準備はできましたか?準備はできましたか?準備はできましたか?準備はできましたか? ATS2コンパイラはインストール済みですか? もし未だなら、次のマニュアルを参考にATS2を インストールしてください: ATS2コンパイラはインストール済みですか? もし未だなら、次のマニュアルを参考にATS2を インストールしてください: ATS2コンパイラはインストール済みですか? もし未だなら、次のマニュアルを参考にATS2を インストールしてください: ATS2コンパイラはインストール済みですか? もし未だなら、次のマニュアルを参考にATS2を インストールしてください: ATS2コンパイラはインストール済みですか? もし未だなら、次のマニュアルを参考にATS2を インストールしてください: ☆ http://bit.ly/instatsj☆ http://bit.ly/instatsj☆ http://bit.ly/instatsj☆ http://bit.ly/instatsj☆ http://bit.ly/instatsj またこのスライドのソースコードも入手できます:またこのスライドのソースコードも入手できます:またこのスライドのソースコードも入手できます:またこのスライドのソースコードも入手できます:またこのスライドのソースコードも入手できます: ☆ http://bit.ly/ats20150523☆ http://bit.ly/ats20150523☆ http://bit.ly/ats20150523☆ http://bit.ly/ats20150523☆ http://bit.ly/ats20150523
  • 3. ATSって何でしょう?ATSって何でしょう?ATSって何でしょう?ATSって何でしょう?ATSって何でしょう? http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/ ☆ MLのような文法☆ MLのような文法☆ MLのような文法☆ MLのような文法☆ MLのような文法 ☆ 依存型☆ 依存型☆ 依存型☆ 依存型☆ 依存型 ☆ 線形型☆ 線形型☆ 線形型☆ 線形型☆ 線形型 ☆ GCなしでも動作☆ GCなしでも動作☆ GCなしでも動作☆ GCなしでも動作☆ GCなしでも動作 ☆ ランタイムシステムを持たない☆ ランタイムシステムを持たない☆ ランタイムシステムを持たない☆ ランタイムシステムを持たない☆ ランタイムシステムを持たない ☆ Dependent MLの後継☆ Dependent MLの後継☆ Dependent MLの後継☆ Dependent MLの後継☆ Dependent MLの後継
  • 4. ATSを使うと何ができるの?ATSを使うと何ができるの?ATSを使うと何ができるの?ATSを使うと何ができるの?ATSを使うと何ができるの? ☆ 依存型を使ってコードに証明を与えられる☆ 依存型を使ってコードに証明を与えられる☆ 依存型を使ってコードに証明を与えられる☆ 依存型を使ってコードに証明を与えられる☆ 依存型を使ってコードに証明を与えられる ☆ 線形型を使ってmallocを安全に扱える☆ 線形型を使ってmallocを安全に扱える☆ 線形型を使ってmallocを安全に扱える☆ 線形型を使ってmallocを安全に扱える☆ 線形型を使ってmallocを安全に扱える ☆ 線形型を使ってポインタを安全に扱える☆ 線形型を使ってポインタを安全に扱える☆ 線形型を使ってポインタを安全に扱える☆ 線形型を使ってポインタを安全に扱える☆ 線形型を使ってポインタを安全に扱える ☆ 強い型をOSなしに使える☆ 強い型をOSなしに使える☆ 強い型をOSなしに使える☆ 強い型をOSなしに使える☆ 強い型をOSなしに使える ☆ ベアメタルの上でコードを書ける☆ ベアメタルの上でコードを書ける☆ ベアメタルの上でコードを書ける☆ ベアメタルの上でコードを書ける☆ ベアメタルの上でコードを書ける ☆ Linux kernel内のコードを書ける☆ Linux kernel内のコードを書ける☆ Linux kernel内のコードを書ける☆ Linux kernel内のコードを書ける☆ Linux kernel内のコードを書ける
  • 5. 今日のゴール今日のゴール今日のゴール今日のゴール今日のゴール ATSには既に良いドキュメントがあります。日本 語訳もあります。 ATSには既に良いドキュメントがあります。日本 語訳もあります。 ATSには既に良いドキュメントがあります。日本 語訳もあります。 ATSには既に良いドキュメントがあります。日本 語訳もあります。 ATSには既に良いドキュメントがあります。日本 語訳もあります。 * ATSプログラミング入門 http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/ * ATSプログラミングチュートリアル http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/ * Effective ATS https://github.com/jats-ug/translate/blob/master/Manual/ EffectiveATS.md * Wiki for ATS2 https://github.com/githwxi/ATS-Postiats/wiki * ATSプログラミング入門 http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/ * ATSプログラミングチュートリアル http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/ * Effective ATS https://github.com/jats-ug/translate/blob/master/Manual/ EffectiveATS.md * Wiki for ATS2 https://github.com/githwxi/ATS-Postiats/wiki * ATSプログラミング入門 http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/ * ATSプログラミングチュートリアル http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/ * Effective ATS https://github.com/jats-ug/translate/blob/master/Manual/ EffectiveATS.md * Wiki for ATS2 https://github.com/githwxi/ATS-Postiats/wiki * ATSプログラミング入門 http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/ * ATSプログラミングチュートリアル http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/ * Effective ATS https://github.com/jats-ug/translate/blob/master/Manual/ EffectiveATS.md * Wiki for ATS2 https://github.com/githwxi/ATS-Postiats/wiki * ATSプログラミング入門 http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/ * ATSプログラミングチュートリアル http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/ * Effective ATS https://github.com/jats-ug/translate/blob/master/Manual/ EffectiveATS.md * Wiki for ATS2 https://github.com/githwxi/ATS-Postiats/wiki けれどもこれらは初心者に難しい面がありま す。 今日のゴールは自分自身で"ATSプログラ ミング入門"を読めるようになることです。 けれどもこれらは初心者に難しい面がありま す。 今日のゴールは自分自身で"ATSプログラ ミング入門"を読めるようになることです。 けれどもこれらは初心者に難しい面がありま す。 今日のゴールは自分自身で"ATSプログラ ミング入門"を読めるようになることです。 けれどもこれらは初心者に難しい面がありま す。 今日のゴールは自分自身で"ATSプログラ ミング入門"を読めるようになることです。 けれどもこれらは初心者に難しい面がありま す。 今日のゴールは自分自身で"ATSプログラ ミング入門"を読めるようになることです。
  • 6. Hello Worldから始めようHello Worldから始めようHello Worldから始めようHello Worldから始めようHello Worldから始めよう $ vi helloworld.dats val () = println! "Hello, world!" implement main0 () = () $ patscc helloworld.dats $ ./a.out Hello, world! $ vi helloworld.dats val () = println! "Hello, world!" implement main0 () = () $ patscc helloworld.dats $ ./a.out Hello, world! $ vi helloworld.dats val () = println! "Hello, world!" implement main0 () = () $ patscc helloworld.dats $ ./a.out Hello, world! $ vi helloworld.dats val () = println! "Hello, world!" implement main0 () = () $ patscc helloworld.dats $ ./a.out Hello, world! $ vi helloworld.dats val () = println! "Hello, world!" implement main0 () = () $ patscc helloworld.dats $ ./a.out Hello, world! 直接 println! を呼び出すこともできます。直接 println! を呼び出すこともできます。直接 println! を呼び出すこともできます。直接 println! を呼び出すこともできます。直接 println! を呼び出すこともできます。 $ vi helloworld2.dats implement main0 () = () where { val () = println! "Hello, world!" } $ vi helloworld2.dats implement main0 () = () where { val () = println! "Hello, world!" } $ vi helloworld2.dats implement main0 () = () where { val () = println! "Hello, world!" } $ vi helloworld2.dats implement main0 () = () where { val () = println! "Hello, world!" } $ vi helloworld2.dats implement main0 () = () where { val () = println! "Hello, world!" } もしくはもっとシンプルに...もしくはもっとシンプルに...もしくはもっとシンプルに...もしくはもっとシンプルに...もしくはもっとシンプルに... $ vi helloworld3.dats implement main0 () = println! "Hello, world!" $ vi helloworld3.dats implement main0 () = println! "Hello, world!" $ vi helloworld3.dats implement main0 () = println! "Hello, world!" $ vi helloworld3.dats implement main0 () = println! "Hello, world!" $ vi helloworld3.dats implement main0 () = println! "Hello, world!"
  • 7. 整数型整数型整数型整数型整数型 "share/atspre_staload.hats" はオーバロー ドされた演算子のために必要です。 "share/atspre_staload.hats" はオーバロー ドされた演算子のために必要です。 "share/atspre_staload.hats" はオーバロー ドされた演算子のために必要です。 "share/atspre_staload.hats" はオーバロー ドされた演算子のために必要です。 "share/atspre_staload.hats" はオーバロー ドされた演算子のために必要です。 $ vi int_op.dats #include "share/atspre_staload.hats" val () = println! (3 + 4 * 2) val () = println! ((3 + 4) * 2) val () = println! (2 - 3) val () = println! (7 / 2) val () = println! (7 % 2) implement main0 () = () $ patscc int_op.dats $ ./a.out 11 14 -1 3 1 $ vi int_op.dats #include "share/atspre_staload.hats" val () = println! (3 + 4 * 2) val () = println! ((3 + 4) * 2) val () = println! (2 - 3) val () = println! (7 / 2) val () = println! (7 % 2) implement main0 () = () $ patscc int_op.dats $ ./a.out 11 14 -1 3 1 $ vi int_op.dats #include "share/atspre_staload.hats" val () = println! (3 + 4 * 2) val () = println! ((3 + 4) * 2) val () = println! (2 - 3) val () = println! (7 / 2) val () = println! (7 % 2) implement main0 () = () $ patscc int_op.dats $ ./a.out 11 14 -1 3 1 $ vi int_op.dats #include "share/atspre_staload.hats" val () = println! (3 + 4 * 2) val () = println! ((3 + 4) * 2) val () = println! (2 - 3) val () = println! (7 / 2) val () = println! (7 % 2) implement main0 () = () $ patscc int_op.dats $ ./a.out 11 14 -1 3 1 $ vi int_op.dats #include "share/atspre_staload.hats" val () = println! (3 + 4 * 2) val () = println! ((3 + 4) * 2) val () = println! (2 - 3) val () = println! (7 / 2) val () = println! (7 % 2) implement main0 () = () $ patscc int_op.dats $ ./a.out 11 14 -1 3 1
  • 8. ゼロ除算の検出ゼロ除算の検出ゼロ除算の検出ゼロ除算の検出ゼロ除算の検出 ゼロ除算はコンパイルエラーになります。ゼロ除算はコンパイルエラーになります。ゼロ除算はコンパイルエラーになります。ゼロ除算はコンパイルエラーになります。ゼロ除算はコンパイルエラーになります。 $ vi divmod.dats #include "share/atspre_staload.hats" val () = println! (7 / (2 - 2)) implement main0 () = () $ patscc divmod.dats /home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61 (line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar (4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) typechecking has failed: there are some unsolved constraints: please inspect the above reported error message(s) for information. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) $ vi divmod.dats #include "share/atspre_staload.hats" val () = println! (7 / (2 - 2)) implement main0 () = () $ patscc divmod.dats /home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61 (line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar (4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) typechecking has failed: there are some unsolved constraints: please inspect the above reported error message(s) for information. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) $ vi divmod.dats #include "share/atspre_staload.hats" val () = println! (7 / (2 - 2)) implement main0 () = () $ patscc divmod.dats /home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61 (line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar (4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) typechecking has failed: there are some unsolved constraints: please inspect the above reported error message(s) for information. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) $ vi divmod.dats #include "share/atspre_staload.hats" val () = println! (7 / (2 - 2)) implement main0 () = () $ patscc divmod.dats /home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61 (line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar (4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) typechecking has failed: there are some unsolved constraints: please inspect the above reported error message(s) for information. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) $ vi divmod.dats #include "share/atspre_staload.hats" val () = println! (7 / (2 - 2)) implement main0 () = () $ patscc divmod.dats /home/kiwamu/tmp/tmp/divmod.dats: 60(line=3, offs=22) -- 61 (line=3, offs=23): error(3): unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar(4177->S2Eapp(S2Ecst(sub_int_int); S2EVar (4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) typechecking has failed: there are some unsolved constraints: please inspect the above reported error message(s) for information. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) でもこのエラー、すごく読み難い...でもこのエラー、すごく読み難い...でもこのエラー、すごく読み難い...でもこのエラー、すごく読み難い...でもこのエラー、すごく読み難い...
  • 9. 内部の型表現を理解しよう内部の型表現を理解しよう内部の型表現を理解しよう内部の型表現を理解しよう内部の型表現を理解しよう 次の内部型で表わされたエラーメッセージを解 釈しましょう: 次の内部型で表わされたエラーメッセージを解 釈しましょう: 次の内部型で表わされたエラーメッセージを解 釈しましょう: 次の内部型で表わされたエラーメッセージを解 釈しましょう: 次の内部型で表わされたエラーメッセージを解 釈しましょう: https://github.com/githwxi/ATS-Postiats/wiki/Internal-types * S2Eapp - 関数適用の項 * S2Ecst - (例えば int, bool, list などのような) 型定数 * S2Eeff - 関数の作用 * S2Eexi - 存在量化型 * S2Eint - マシン精度整数 * S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます * S2Evar - (通常、全称量化の)変数 * S2Etop (0; T) - T? を意味する * S2Etop (1; T) - T?! を意味する * S2EVar - 型検査器によって導入された(存在量化の)変数 https://github.com/githwxi/ATS-Postiats/wiki/Internal-types * S2Eapp - 関数適用の項 * S2Ecst - (例えば int, bool, list などのような) 型定数 * S2Eeff - 関数の作用 * S2Eexi - 存在量化型 * S2Eint - マシン精度整数 * S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます * S2Evar - (通常、全称量化の)変数 * S2Etop (0; T) - T? を意味する * S2Etop (1; T) - T?! を意味する * S2EVar - 型検査器によって導入された(存在量化の)変数 https://github.com/githwxi/ATS-Postiats/wiki/Internal-types * S2Eapp - 関数適用の項 * S2Ecst - (例えば int, bool, list などのような) 型定数 * S2Eeff - 関数の作用 * S2Eexi - 存在量化型 * S2Eint - マシン精度整数 * S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます * S2Evar - (通常、全称量化の)変数 * S2Etop (0; T) - T? を意味する * S2Etop (1; T) - T?! を意味する * S2EVar - 型検査器によって導入された(存在量化の)変数 https://github.com/githwxi/ATS-Postiats/wiki/Internal-types * S2Eapp - 関数適用の項 * S2Ecst - (例えば int, bool, list などのような) 型定数 * S2Eeff - 関数の作用 * S2Eexi - 存在量化型 * S2Eint - マシン精度整数 * S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます * S2Evar - (通常、全称量化の)変数 * S2Etop (0; T) - T? を意味する * S2Etop (1; T) - T?! を意味する * S2EVar - 型検査器によって導入された(存在量化の)変数 https://github.com/githwxi/ATS-Postiats/wiki/Internal-types * S2Eapp - 関数適用の項 * S2Ecst - (例えば int, bool, list などのような) 型定数 * S2Eeff - 関数の作用 * S2Eexi - 存在量化型 * S2Eint - マシン精度整数 * S2Eintinf - 任意精度整数; 殆どのpatsoptで整数種として使われます * S2Evar - (通常、全称量化の)変数 * S2Etop (0; T) - T? を意味する * S2Etop (1; T) - T?! を意味する * S2EVar - 型検査器によって導入された(存在量化の)変数
  • 10. ゼロ除算の意味は...ゼロ除算の意味は...ゼロ除算の意味は...ゼロ除算の意味は...ゼロ除算の意味は... unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar (4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) ↓ つまり... 命題 "2 - 2 != 0" が解決できない、と言っている unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar (4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) ↓ つまり... 命題 "2 - 2 != 0" が解決できない、と言っている unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar (4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) ↓ つまり... 命題 "2 - 2 != 0" が解決できない、と言っている unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar (4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) ↓ つまり... 命題 "2 - 2 != 0" が解決できない、と言っている unsolved constraint: C3NSTRprop(main; S2Eapp(S2Ecst(!=); S2EVar (4177->S2Eapp(S2Ecst(sub_int_int); S2EVar(4173->S2Eintinf(2)), S2EVar(4174->S2Eintinf(2)))), S2Eintinf(0))) ↓ つまり... 命題 "2 - 2 != 0" が解決できない、と言っている これは依存型の力によっていて、ATS言語の preludeライブラリで使われています。 これは依存型の力によっていて、ATS言語の preludeライブラリで使われています。 これは依存型の力によっていて、ATS言語の preludeライブラリで使われています。 これは依存型の力によっていて、ATS言語の preludeライブラリで使われています。 これは依存型の力によっていて、ATS言語の preludeライブラリで使われています。 $ vi ATS-Postiats/prelude/SATS/integer.sats typedef g1int_div_type (tk:tk) = {i,j:int | j != 0} (g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk) --snip-- fun g1int_div_int : g1int_div_type (intknd) = "mac#%" fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%" fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%" fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%" $ vi ATS-Postiats/prelude/SATS/integer.sats typedef g1int_div_type (tk:tk) = {i,j:int | j != 0} (g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk) --snip-- fun g1int_div_int : g1int_div_type (intknd) = "mac#%" fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%" fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%" fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%" $ vi ATS-Postiats/prelude/SATS/integer.sats typedef g1int_div_type (tk:tk) = {i,j:int | j != 0} (g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk) --snip-- fun g1int_div_int : g1int_div_type (intknd) = "mac#%" fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%" fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%" fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%" $ vi ATS-Postiats/prelude/SATS/integer.sats typedef g1int_div_type (tk:tk) = {i,j:int | j != 0} (g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk) --snip-- fun g1int_div_int : g1int_div_type (intknd) = "mac#%" fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%" fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%" fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%" $ vi ATS-Postiats/prelude/SATS/integer.sats typedef g1int_div_type (tk:tk) = {i,j:int | j != 0} (g1int (tk, i), g1int (tk, j)) -<fun0> g1int (tk) --snip-- fun g1int_div_int : g1int_div_type (intknd) = "mac#%" fun g1int_div_lint : g1int_div_type (lintknd) = "mac#%" fun g1int_div_llint : g1int_div_type (llintknd) = "mac#%" fun g1int_div_ssize : g1int_div_type (ssizeknd) = "mac#%"
  • 11. 実数型実数型実数型実数型実数型 $ vi double_op.dats #include "share/atspre_staload.hats" val () = println! ((3.0 + 5.0) * 8.0 / 3.0) implement main0 () = () $ patscc double_op.dats $ ./a.out 21.333333 $ vi double_op.dats #include "share/atspre_staload.hats" val () = println! ((3.0 + 5.0) * 8.0 / 3.0) implement main0 () = () $ patscc double_op.dats $ ./a.out 21.333333 $ vi double_op.dats #include "share/atspre_staload.hats" val () = println! ((3.0 + 5.0) * 8.0 / 3.0) implement main0 () = () $ patscc double_op.dats $ ./a.out 21.333333 $ vi double_op.dats #include "share/atspre_staload.hats" val () = println! ((3.0 + 5.0) * 8.0 / 3.0) implement main0 () = () $ patscc double_op.dats $ ./a.out 21.333333 $ vi double_op.dats #include "share/atspre_staload.hats" val () = println! ((3.0 + 5.0) * 8.0 / 3.0) implement main0 () = () $ patscc double_op.dats $ ./a.out 21.333333 演算子はオーバーロードされています。演算子はオーバーロードされています。演算子はオーバーロードされています。演算子はオーバーロードされています。演算子はオーバーロードされています。 $ vi double_int_op.dats #include "share/atspre_staload.hats" val () = println! ((3 + 5.0) * 8 / 3.0) implement main0 () = () $ patscc double_int_op.dats $ ./a.out 21.333333 $ vi double_int_op.dats #include "share/atspre_staload.hats" val () = println! ((3 + 5.0) * 8 / 3.0) implement main0 () = () $ patscc double_int_op.dats $ ./a.out 21.333333 $ vi double_int_op.dats #include "share/atspre_staload.hats" val () = println! ((3 + 5.0) * 8 / 3.0) implement main0 () = () $ patscc double_int_op.dats $ ./a.out 21.333333 $ vi double_int_op.dats #include "share/atspre_staload.hats" val () = println! ((3 + 5.0) * 8 / 3.0) implement main0 () = () $ patscc double_int_op.dats $ ./a.out 21.333333 $ vi double_int_op.dats #include "share/atspre_staload.hats" val () = println! ((3 + 5.0) * 8 / 3.0) implement main0 () = () $ patscc double_int_op.dats $ ./a.out 21.333333
  • 12. 真偽値真偽値真偽値真偽値真偽値 trueとfalseが真偽値です。trueとfalseが真偽値です。trueとfalseが真偽値です。trueとfalseが真偽値です。trueとfalseが真偽値です。 $ vi bool_op.dats #include "share/atspre_staload.hats" val () = println! (true && false) val () = println! (not (false || not false && not false)) val () = println! (2 < 3) val () = println! (2 < 3 && 2.0 >= 3.0) val () = println! (2 < 3 || 2.0 = 3.0) val () = println! (not (3 < 2)) implement main0 () = () $ patscc bool_op.dats $ ./a.out false false true false true true $ vi bool_op.dats #include "share/atspre_staload.hats" val () = println! (true && false) val () = println! (not (false || not false && not false)) val () = println! (2 < 3) val () = println! (2 < 3 && 2.0 >= 3.0) val () = println! (2 < 3 || 2.0 = 3.0) val () = println! (not (3 < 2)) implement main0 () = () $ patscc bool_op.dats $ ./a.out false false true false true true $ vi bool_op.dats #include "share/atspre_staload.hats" val () = println! (true && false) val () = println! (not (false || not false && not false)) val () = println! (2 < 3) val () = println! (2 < 3 && 2.0 >= 3.0) val () = println! (2 < 3 || 2.0 = 3.0) val () = println! (not (3 < 2)) implement main0 () = () $ patscc bool_op.dats $ ./a.out false false true false true true $ vi bool_op.dats #include "share/atspre_staload.hats" val () = println! (true && false) val () = println! (not (false || not false && not false)) val () = println! (2 < 3) val () = println! (2 < 3 && 2.0 >= 3.0) val () = println! (2 < 3 || 2.0 = 3.0) val () = println! (not (3 < 2)) implement main0 () = () $ patscc bool_op.dats $ ./a.out false false true false true true $ vi bool_op.dats #include "share/atspre_staload.hats" val () = println! (true && false) val () = println! (not (false || not false && not false)) val () = println! (2 < 3) val () = println! (2 < 3 && 2.0 >= 3.0) val () = println! (2 < 3 || 2.0 = 3.0) val () = println! (not (3 < 2)) implement main0 () = () $ patscc bool_op.dats $ ./a.out false false true false true true
  • 13. 定数定義定数定義定数定義定数定義定数定義 valキーワードを使って定数を定義できます。valキーワードを使って定数を定義できます。valキーワードを使って定数を定義できます。valキーワードを使って定数を定義できます。valキーワードを使って定数を定義できます。 $ vi val_overwrite.dats #include "share/atspre_staload.hats" implement main0 () = { val a = 1 val b = a val () = println! a val () = println! b val a = 2 val () = println! a val () = println! b } $ patscc val_overwrite.dats $ ./a.out 1 1 2 1 $ vi val_overwrite.dats #include "share/atspre_staload.hats" implement main0 () = { val a = 1 val b = a val () = println! a val () = println! b val a = 2 val () = println! a val () = println! b } $ patscc val_overwrite.dats $ ./a.out 1 1 2 1 $ vi val_overwrite.dats #include "share/atspre_staload.hats" implement main0 () = { val a = 1 val b = a val () = println! a val () = println! b val a = 2 val () = println! a val () = println! b } $ patscc val_overwrite.dats $ ./a.out 1 1 2 1 $ vi val_overwrite.dats #include "share/atspre_staload.hats" implement main0 () = { val a = 1 val b = a val () = println! a val () = println! b val a = 2 val () = println! a val () = println! b } $ patscc val_overwrite.dats $ ./a.out 1 1 2 1 $ vi val_overwrite.dats #include "share/atspre_staload.hats" implement main0 () = { val a = 1 val b = a val () = println! a val () = println! b val a = 2 val () = println! a val () = println! b } $ patscc val_overwrite.dats $ ./a.out 1 1 2 1
  • 14. 関数定義関数定義関数定義関数定義関数定義 funキーワードを使って関数を定義できます。funキーワードを使って関数を定義できます。funキーワードを使って関数を定義できます。funキーワードを使って関数を定義できます。funキーワードを使って関数を定義できます。 $ vi two_arguments.dats #include "share/atspre_staload.hats" fun g (x:int, y:int): int = x * x + y * y - 4 implement main0 () = println! (g (3, 2)) $ patscc two_arguments.dats $ ./a.out 9 $ vi two_arguments.dats #include "share/atspre_staload.hats" fun g (x:int, y:int): int = x * x + y * y - 4 implement main0 () = println! (g (3, 2)) $ patscc two_arguments.dats $ ./a.out 9 $ vi two_arguments.dats #include "share/atspre_staload.hats" fun g (x:int, y:int): int = x * x + y * y - 4 implement main0 () = println! (g (3, 2)) $ patscc two_arguments.dats $ ./a.out 9 $ vi two_arguments.dats #include "share/atspre_staload.hats" fun g (x:int, y:int): int = x * x + y * y - 4 implement main0 () = println! (g (3, 2)) $ patscc two_arguments.dats $ ./a.out 9 $ vi two_arguments.dats #include "share/atspre_staload.hats" fun g (x:int, y:int): int = x * x + y * y - 4 implement main0 () = println! (g (3, 2)) $ patscc two_arguments.dats $ ./a.out 9
  • 15. 型検査型検査型検査型検査型検査 $ vi f_takes_double.dats #include "share/atspre_staload.hats" fun f (x:int): int = 3 * x implement main0 () = { val r = f 4.0 val () = println! r } $ patscc f_takes_double.dats /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): the dynamic expression cannot be assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))]. /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): mismatch of static terms (tyleq): The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst (double_kind)) The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind)) $ vi f_takes_double.dats #include "share/atspre_staload.hats" fun f (x:int): int = 3 * x implement main0 () = { val r = f 4.0 val () = println! r } $ patscc f_takes_double.dats /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): the dynamic expression cannot be assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))]. /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): mismatch of static terms (tyleq): The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst (double_kind)) The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind)) $ vi f_takes_double.dats #include "share/atspre_staload.hats" fun f (x:int): int = 3 * x implement main0 () = { val r = f 4.0 val () = println! r } $ patscc f_takes_double.dats /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): the dynamic expression cannot be assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))]. /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): mismatch of static terms (tyleq): The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst (double_kind)) The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind)) $ vi f_takes_double.dats #include "share/atspre_staload.hats" fun f (x:int): int = 3 * x implement main0 () = { val r = f 4.0 val () = println! r } $ patscc f_takes_double.dats /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): the dynamic expression cannot be assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))]. /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): mismatch of static terms (tyleq): The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst (double_kind)) The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind)) $ vi f_takes_double.dats #include "share/atspre_staload.hats" fun f (x:int): int = 3 * x implement main0 () = { val r = f 4.0 val () = println! r } $ patscc f_takes_double.dats /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): the dynamic expression cannot be assigned the type [S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind))]. /home/kiwamu/tmp/tmp/f_takes_double.dats: 103(line=6, offs=14) -- 106(line=6, offs=17): error(3): mismatch of static terms (tyleq): The actual term is: S2Eapp(S2Ecst(g0float_t0ype); S2Ecst (double_kind)) The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Ecst(int_kind)) 関数 "f" はint型の値を取るべきでした。関数 "f" はint型の値を取るべきでした。関数 "f" はint型の値を取るべきでした。関数 "f" はint型の値を取るべきでした。関数 "f" はint型の値を取るべきでした。
  • 16. 条件分岐条件分岐条件分岐条件分岐条件分岐 if then elseキーワードが使えます。if then elseキーワードが使えます。if then elseキーワードが使えます。if then elseキーワードが使えます。if then elseキーワードが使えます。 $ vi if_then_else.dats #include "share/atspre_staload.hats" implement main0 () = { val a = if 1 < 2 then 3 else 4 val () = println! (a:int) } $ patscc if_then_else.dats $ ./a.out 3 $ vi if_then_else.dats #include "share/atspre_staload.hats" implement main0 () = { val a = if 1 < 2 then 3 else 4 val () = println! (a:int) } $ patscc if_then_else.dats $ ./a.out 3 $ vi if_then_else.dats #include "share/atspre_staload.hats" implement main0 () = { val a = if 1 < 2 then 3 else 4 val () = println! (a:int) } $ patscc if_then_else.dats $ ./a.out 3 $ vi if_then_else.dats #include "share/atspre_staload.hats" implement main0 () = { val a = if 1 < 2 then 3 else 4 val () = println! (a:int) } $ patscc if_then_else.dats $ ./a.out 3 $ vi if_then_else.dats #include "share/atspre_staload.hats" implement main0 () = { val a = if 1 < 2 then 3 else 4 val () = println! (a:int) } $ patscc if_then_else.dats $ ./a.out 3
  • 17. else節は省略できますelse節は省略できますelse節は省略できますelse節は省略できますelse節は省略できます else節の型がvoidであれば省略できます。else節の型がvoidであれば省略できます。else節の型がvoidであれば省略できます。else節の型がvoidであれば省略できます。else節の型がvoidであれば省略できます。 $ vi println_expr.dats #include "share/atspre_staload.hats" implement main0 () = if 7 > 5 then println! "It's true." $ patscc println_expr.dats $ ./a.out It's true. $ vi println_expr.dats #include "share/atspre_staload.hats" implement main0 () = if 7 > 5 then println! "It's true." $ patscc println_expr.dats $ ./a.out It's true. $ vi println_expr.dats #include "share/atspre_staload.hats" implement main0 () = if 7 > 5 then println! "It's true." $ patscc println_expr.dats $ ./a.out It's true. $ vi println_expr.dats #include "share/atspre_staload.hats" implement main0 () = if 7 > 5 then println! "It's true." $ patscc println_expr.dats $ ./a.out It's true. $ vi println_expr.dats #include "share/atspre_staload.hats" implement main0 () = if 7 > 5 then println! "It's true." $ patscc println_expr.dats $ ./a.out It's true.
  • 18. 型を表示するには$showtype型を表示するには$showtype型を表示するには$showtype型を表示するには$showtype型を表示するには$showtype $showtypeキーワードに任意の値を渡すと、コ ンパイル時にその型を表示してくれます。 $showtypeキーワードに任意の値を渡すと、コ ンパイル時にその型を表示してくれます。 $showtypeキーワードに任意の値を渡すと、コ ンパイル時にその型を表示してくれます。 $showtypeキーワードに任意の値を渡すと、コ ンパイル時にその型を表示してくれます。 $showtypeキーワードに任意の値を渡すと、コ ンパイル時にその型を表示してくれます。 $ vi showtype_int.dats val () = println! 3 val _ = $showtype 3 implement main0 () = () $ patscc showtype_int.dats **SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39 (line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst (g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas (S2RTBASimp(1; t@ype)) $ ./a.out 3 $ vi showtype_int.dats val () = println! 3 val _ = $showtype 3 implement main0 () = () $ patscc showtype_int.dats **SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39 (line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst (g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas (S2RTBASimp(1; t@ype)) $ ./a.out 3 $ vi showtype_int.dats val () = println! 3 val _ = $showtype 3 implement main0 () = () $ patscc showtype_int.dats **SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39 (line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst (g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas (S2RTBASimp(1; t@ype)) $ ./a.out 3 $ vi showtype_int.dats val () = println! 3 val _ = $showtype 3 implement main0 () = () $ patscc showtype_int.dats **SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39 (line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst (g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas (S2RTBASimp(1; t@ype)) $ ./a.out 3 $ vi showtype_int.dats val () = println! 3 val _ = $showtype 3 implement main0 () = () $ patscc showtype_int.dats **SHOWTYPE[UP]**(/home/kiwamu/tmp/tmp/showtype_int.dats: 39 (line=2, offs=19) -- 40(line=2, offs=20)): S2Eapp(S2Ecst (g1int_int_t0ype); S2Ecst(int_kind), S2Eintinf(3)): S2RTbas (S2RTBASimp(1; t@ype)) $ ./a.out 3
  • 19. 不変の文字列不変の文字列不変の文字列不変の文字列不変の文字列 "foo"は不変の文字列のリテラルです。"foo"は不変の文字列のリテラルです。"foo"は不変の文字列のリテラルです。"foo"は不変の文字列のリテラルです。"foo"は不変の文字列のリテラルです。 $ vi print_foo.dats #include "share/atspre_staload.hats" val () = println! "foo" implement main0 () = () $ patscc print_foo.dats $ ./a.out foo $ vi print_foo.dats #include "share/atspre_staload.hats" val () = println! "foo" implement main0 () = () $ patscc print_foo.dats $ ./a.out foo $ vi print_foo.dats #include "share/atspre_staload.hats" val () = println! "foo" implement main0 () = () $ patscc print_foo.dats $ ./a.out foo $ vi print_foo.dats #include "share/atspre_staload.hats" val () = println! "foo" implement main0 () = () $ patscc print_foo.dats $ ./a.out foo $ vi print_foo.dats #include "share/atspre_staload.hats" val () = println! "foo" implement main0 () = () $ patscc print_foo.dats $ ./a.out foo けれども、不変の文字列では連結や逆順のよ うな操作を使えません。 けれども、不変の文字列では連結や逆順のよ うな操作を使えません。 けれども、不変の文字列では連結や逆順のよ うな操作を使えません。 けれども、不変の文字列では連結や逆順のよ うな操作を使えません。 けれども、不変の文字列では連結や逆順のよ うな操作を使えません。
  • 20. 可変の文字列を使ってみよう可変の文字列を使ってみよう可変の文字列を使ってみよう可変の文字列を使ってみよう可変の文字列を使ってみよう 2つの不変の文字列を連結してみましょう。2つの不変の文字列を連結してみましょう。2つの不変の文字列を連結してみましょう。2つの不変の文字列を連結してみましょう。2つの不変の文字列を連結してみましょう。 $ vi try_string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 } $ patscc try_string_append.dats /home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135 (line=6, offs=2): error(3): the linear dynamic variable [s3$3509 (-1)] needs to be consumed but it is preserved with the type [S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead. patsopt(TRANS3): there are [1] errors in total. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) $ vi try_string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 } $ patscc try_string_append.dats /home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135 (line=6, offs=2): error(3): the linear dynamic variable [s3$3509 (-1)] needs to be consumed but it is preserved with the type [S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead. patsopt(TRANS3): there are [1] errors in total. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) $ vi try_string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 } $ patscc try_string_append.dats /home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135 (line=6, offs=2): error(3): the linear dynamic variable [s3$3509 (-1)] needs to be consumed but it is preserved with the type [S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead. patsopt(TRANS3): there are [1] errors in total. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) $ vi try_string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 } $ patscc try_string_append.dats /home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135 (line=6, offs=2): error(3): the linear dynamic variable [s3$3509 (-1)] needs to be consumed but it is preserved with the type [S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead. patsopt(TRANS3): there are [1] errors in total. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) $ vi try_string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 } $ patscc try_string_append.dats /home/kiwamu/tmp/try_string_append.dats: 60(line=3, offs=22) -- 135 (line=6, offs=2): error(3): the linear dynamic variable [s3$3509 (-1)] needs to be consumed but it is preserved with the type [S2Eapp(S2Ecst(strptr_addr_vtype); S2EVar(4175))] instead. patsopt(TRANS3): there are [1] errors in total. exit(ATS): uncaught exception: _2home_2kiwamu_2src_2ATS_2dPostiats_2src_2pats_error_2esats__FatalE rrorExn(1025) なぜエラーになったのでしょうか?なぜエラーになったのでしょうか?なぜエラーになったのでしょうか?なぜエラーになったのでしょうか?なぜエラーになったのでしょうか?
  • 21. 可変の文字列はfreeする必要がある可変の文字列はfreeする必要がある可変の文字列はfreeする必要がある可変の文字列はfreeする必要がある可変の文字列はfreeする必要がある 連結で生成した可変の文字列をfreeし忘れて いました。 連結で生成した可変の文字列をfreeし忘れて いました。 連結で生成した可変の文字列をfreeし忘れて いました。 連結で生成した可変の文字列をfreeし忘れて いました。 連結で生成した可変の文字列をfreeし忘れて いました。 $ vi string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 val () = free s3 } $ patscc string_append.dats -DATS_MEMALLOC_LIBC $ ./a.out YokohamaStation $ vi string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 val () = free s3 } $ patscc string_append.dats -DATS_MEMALLOC_LIBC $ ./a.out YokohamaStation $ vi string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 val () = free s3 } $ patscc string_append.dats -DATS_MEMALLOC_LIBC $ ./a.out YokohamaStation $ vi string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 val () = free s3 } $ patscc string_append.dats -DATS_MEMALLOC_LIBC $ ./a.out YokohamaStation $ vi string_append.dats #include "share/atspre_staload.hats" implement main0 () = { val s3 = string_append ("Yokohama", "Station") val () = println! s3 val () = free s3 } $ patscc string_append.dats -DATS_MEMALLOC_LIBC $ ./a.out YokohamaStation "ATS_MEMALLOC_LIBC"フラグはlibcの mallocを使うために必要です。 どうやって ATS2はfree忘れを検出したのでしょうか? "ATS_MEMALLOC_LIBC"フラグはlibcの mallocを使うために必要です。 どうやって ATS2はfree忘れを検出したのでしょうか? "ATS_MEMALLOC_LIBC"フラグはlibcの mallocを使うために必要です。 どうやって ATS2はfree忘れを検出したのでしょうか? "ATS_MEMALLOC_LIBC"フラグはlibcの mallocを使うために必要です。 どうやって ATS2はfree忘れを検出したのでしょうか? "ATS_MEMALLOC_LIBC"フラグはlibcの mallocを使うために必要です。 どうやって ATS2はfree忘れを検出したのでしょうか?
  • 24. リストの生成リストの生成リストの生成リストの生成リストの生成 list_vt_make_pair (A, B)はAとBを要素に持 つリストを生成します。 list_vt_make_pair (A, B)はAとBを要素に持 つリストを生成します。 list_vt_make_pair (A, B)はAとBを要素に持 つリストを生成します。 list_vt_make_pair (A, B)はAとBを要素に持 つリストを生成します。 list_vt_make_pair (A, B)はAとBを要素に持 つリストを生成します。 $ vi make_pair.dats #include "share/atspre_staload.hats" implement main0 () = { val l = list_vt_make_pair (1, 2) val () = print_list_vt<int> l val () = list_vt_free<int> l } $ patscc make_pair.dats -DATS_MEMALLOC_LIBC $ ./a.out 1, 2 $ vi make_pair.dats #include "share/atspre_staload.hats" implement main0 () = { val l = list_vt_make_pair (1, 2) val () = print_list_vt<int> l val () = list_vt_free<int> l } $ patscc make_pair.dats -DATS_MEMALLOC_LIBC $ ./a.out 1, 2 $ vi make_pair.dats #include "share/atspre_staload.hats" implement main0 () = { val l = list_vt_make_pair (1, 2) val () = print_list_vt<int> l val () = list_vt_free<int> l } $ patscc make_pair.dats -DATS_MEMALLOC_LIBC $ ./a.out 1, 2 $ vi make_pair.dats #include "share/atspre_staload.hats" implement main0 () = { val l = list_vt_make_pair (1, 2) val () = print_list_vt<int> l val () = list_vt_free<int> l } $ patscc make_pair.dats -DATS_MEMALLOC_LIBC $ ./a.out 1, 2 $ vi make_pair.dats #include "share/atspre_staload.hats" implement main0 () = { val l = list_vt_make_pair (1, 2) val () = print_list_vt<int> l val () = list_vt_free<int> l } $ patscc make_pair.dats -DATS_MEMALLOC_LIBC $ ./a.out 1, 2 テンプレート関数を使うために "<int>" が必要 です。 テンプレート関数を使うために "<int>" が必要 です。 テンプレート関数を使うために "<int>" が必要 です。 テンプレート関数を使うために "<int>" が必要 です。 テンプレート関数を使うために "<int>" が必要 です。
  • 26. リストの連結リストの連結リストの連結リストの連結リストの連結 list_vt_append (L1, L2)はリストL1とL2を消 費して、それらを連結した新しいリストを生成し ます。 list_vt_append (L1, L2)はリストL1とL2を消 費して、それらを連結した新しいリストを生成し ます。 list_vt_append (L1, L2)はリストL1とL2を消 費して、それらを連結した新しいリストを生成し ます。 list_vt_append (L1, L2)はリストL1とL2を消 費して、それらを連結した新しいリストを生成し ます。 list_vt_append (L1, L2)はリストL1とL2を消 費して、それらを連結した新しいリストを生成し ます。 $ vi append_list.dats #include "share/atspre_staload.hats" implement main0 () = { val l1 = list_vt_make_pair (1, 2) val l2 = list_vt_make_sing 3 val l3 = list_vt_append (l2, l1) val () = print_list_vt<int> l3 val () = list_vt_free<int> l3 } $ patscc append_list.dats -DATS_MEMALLOC_LIBC $ ./a.out 3, 1, 2 $ vi append_list.dats #include "share/atspre_staload.hats" implement main0 () = { val l1 = list_vt_make_pair (1, 2) val l2 = list_vt_make_sing 3 val l3 = list_vt_append (l2, l1) val () = print_list_vt<int> l3 val () = list_vt_free<int> l3 } $ patscc append_list.dats -DATS_MEMALLOC_LIBC $ ./a.out 3, 1, 2 $ vi append_list.dats #include "share/atspre_staload.hats" implement main0 () = { val l1 = list_vt_make_pair (1, 2) val l2 = list_vt_make_sing 3 val l3 = list_vt_append (l2, l1) val () = print_list_vt<int> l3 val () = list_vt_free<int> l3 } $ patscc append_list.dats -DATS_MEMALLOC_LIBC $ ./a.out 3, 1, 2 $ vi append_list.dats #include "share/atspre_staload.hats" implement main0 () = { val l1 = list_vt_make_pair (1, 2) val l2 = list_vt_make_sing 3 val l3 = list_vt_append (l2, l1) val () = print_list_vt<int> l3 val () = list_vt_free<int> l3 } $ patscc append_list.dats -DATS_MEMALLOC_LIBC $ ./a.out 3, 1, 2 $ vi append_list.dats #include "share/atspre_staload.hats" implement main0 () = { val l1 = list_vt_make_pair (1, 2) val l2 = list_vt_make_sing 3 val l3 = list_vt_append (l2, l1) val () = print_list_vt<int> l3 val () = list_vt_free<int> l3 } $ patscc append_list.dats -DATS_MEMALLOC_LIBC $ ./a.out 3, 1, 2
  • 28. Japan ATS User GroupどうですかJapan ATS User GroupどうですかJapan ATS User GroupどうですかJapan ATS User GroupどうですかJapan ATS User Groupどうですか 日本語でATSに関する情報交換をするグルー プJapan ATS User Group (JATS-UG)があ ります。 現在の主な活動はATS関連ドキュメン トの日本語翻訳です。 日本語でATSに関する情報交換をするグルー プJapan ATS User Group (JATS-UG)があ ります。 現在の主な活動はATS関連ドキュメン トの日本語翻訳です。 日本語でATSに関する情報交換をするグルー プJapan ATS User Group (JATS-UG)があ ります。 現在の主な活動はATS関連ドキュメン トの日本語翻訳です。 日本語でATSに関する情報交換をするグルー プJapan ATS User Group (JATS-UG)があ ります。 現在の主な活動はATS関連ドキュメン トの日本語翻訳です。 日本語でATSに関する情報交換をするグルー プJapan ATS User Group (JATS-UG)があ ります。 現在の主な活動はATS関連ドキュメン トの日本語翻訳です。 http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/ 入会にあたって特に規則などはありません。 「オレはJATS-UGメンバーだぜ」 と言ったその 日からあなたもメンバーです! 入会にあたって特に規則などはありません。 「オレはJATS-UGメンバーだぜ」 と言ったその 日からあなたもメンバーです! 入会にあたって特に規則などはありません。 「オレはJATS-UGメンバーだぜ」 と言ったその 日からあなたもメンバーです! 入会にあたって特に規則などはありません。 「オレはJATS-UGメンバーだぜ」 と言ったその 日からあなたもメンバーです! 入会にあたって特に規則などはありません。 「オレはJATS-UGメンバーだぜ」 と言ったその 日からあなたもメンバーです!