SML

SMLでApplicativeを書く

コードはcodeplexに置いてあります。 (sml/njでuse "applicative.use"; するとApplicativeなOptionが使えます)) http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Applicative.html を参考にしました。 とりあえず下のレイヤから書いて…

SML/NJ インタプリタの表示設定を変更する

SML

SML/NJのインタプリタは, 入力した式の評価結果をいい感じに表示してくれるので便利ですが, 複雑なデータは適当に省略されて表示されてしまいます.たとえばこんな感じ. - val xs = List.tabulate (15,fn x=>x); val xs = [0,1,2,3,4,5,6,7,8,9,10,11,...] : …

CompileManager(SML用make)の使い方

SML

CompileManager(以下CM)はSML/NJに付いてくるmakeシステムです. ある程度分かってきたのでメモしておきます. cmファイル(ライブラリファイル)は特定のソースファイルセットから, 指定した structure/signature/functor/funsig のみを公開してライブラリにす…

Windows上のvimshellでSMLインタプリタを動かす

Windows上のgvimで動いているvimshellから(主にSMLNJの)インタプリタを使いたいですが, これはシェルスクリプトなので, 単にコマンド名を打つだけだとvimshellから実行出来ません. vimshell> sml !!!Error: File "sml" is not found. (以下略 cygwin用のrlwr…

SMLの演算子でセクションとbacktick notationを実現する

Haskellにはセクションという機能があって, ラムダ式を書かずに中置演算子を引数の片方のみに適用することが出来ます. Prelude> 5 - 2 3 Prelude> (-) 3 5 -2 Prelude> (7 -) 3 {- 左側に7を渡す -} 4 Prelude> (- 4) 8 {- 右側に4を渡す -} 4 これはSMLでは…

for-loopを実装する

SML

SMLにはwhile-loopがありますが,for-loopはありません. しかし悲しいことに,時にはあった方が便利です. 受け入れましょう.要は副作用を起こす関数に整数を渡してやればよいのです. (* i -> j のループ *) fun to (i,j) f = let fun loop i = if i<j then (f i; loop (i+1)) else () in loop i end; fun downto (i,j) f = let fun loop i = if i>j then (f (</j>…

MLton用乱数モジュール

SML

以前SML/NJ用で乱数を使うために,MoscowMLの乱数モジュールを真似たモノを作りました. 今回はMLton用に同じシグネチャを持つモジュールを定義しました.シグネチャはMoscowMLの提供するモノと同じ. signature MOSCOWRANDOM = sig type generator val newgense…

MLton(+SML/NJ)のためのユニットテスト環境

SML

前回(SML/NJでのUnitTest環境の構築)で構築した ユニットテスト環境をSMLコンパイラである MLton で使えるようにします. .cmファイル(SML/NJ用のmakefile)と.mlb(MLton用のmakefile)から同様に使えるようにするため, SML/NJ用の環境も少し変更したので両方の…

自作if式モドキ

SML

ref. (:?) な三項演算子っぽいものを使う lazyにすれば組み込みのifっぽい動きが出来るはず. $ sml -Cparser.lazy-keyword=true (*起動*) open Lazy fun force ($ x) = x infix ? fun true ? (t,f) = force t | false ? (t,f) = force f 条件が偽の場合 - (1…

SML/NJで遅延リスト(再び)

SML

以前SMLで遅延リストを作る方法を紹介しましたが, どうしてもサンクを作るためにラムダ式をその場で作らなければならず, 記述が冗長でした. 以前の記述 open SMLofNJ.Susp datatype 'a lazylist = lnil | ::: of 'a * 'a lazylist Susp.susp (* takeの実装例…

SML/NJでのUnitTest環境の構築

SML

SMLのUnit Testライブラリを見つけました. このsml-extライブラリにはいくつかの種類のモジュールが含まれており, その内の一つにUnitTestsというstructureが用意されています. SML/njから使う方法を書きます. インストール チェックアウト svn checkout htt…

SMLでSocketプログラミング

SML

SMLのBasisライブラリにはBSD-Socketのインターフェースが含まれている*1 ので使ってみました. 以下にサーバ側で待ち受けるソケットを作る箇所を示します. structure S = Socket structure N = INetSock infix >>= fun op>>= (NONE ,_) = NONE | op>>= (SOME…

functional readerから遅延リストを作る

SML

('a, 'b) reader SML(のStringCvt)には datatype ('a, 'b) reader = 'b -> ('a, 'b) option という型が定義されています. これは'b型の入力から'a型の値を読み出して, 読み出した残りのデータとのペアを返す関数型です.*1 読み出しに失敗した場合はNONEが返…

SMLのMessagePackライブラリを公開しました!

StandardMLでMessagePackを読み書き(?)するライブラリMsgPack-SML*1 を公開しました! http://msgpacksml.codeplex.com/ トップ画面から, [Source Code]->[Download] でダウンロードできます.真面目なテストはしてないですが, MessagePackの一通りのデータ型…

mltonのbootstrap

SML

割とあっさりbootstrapまで出来たんだけど,一応メモ. モチベーション SML/njには PackReal が用意されておらず, 実数をバイト列として取り出すことが出来ません>< PackReal(とWord系)が豊富に用意されているっぽいので mlton を入れてみました. インストー…

SMLでsleep sort

SML

書いてみた。 sleep sortとは コード open Posix; fun allwait () = let val _ = (Process.wait (); ()) handle SysErr => () in allwait () end fun sleep_print x = (Process.sleep (Time.fromSeconds (LargeInt.fromInt x)) ;print (Int.toString x)) fun…

配列モジュール

SML

SMLの配列モジュールを紹介します. ML系はみんなそうだと思いますが, リストの方が柔軟な操作が可能ですので パフォーマンス上の理由以外に配列を使うことは無さそうです. (あとは長さを明示すると分かりやすい時に使うかも知れない?) Vector vs Array SML…

SML/njで乱数

SML

SMLの標準(Basis)では, どうやら乱数を提供する関数は用意されていない様子です. SML/njにはRandom/RAND structureが用意されていますがプリミティブ過ぎて使いづらいです. (どうしても関数内部に状態を持たせたくない様子…?)ですがMoscowMLという処理系に…

SMLでtype erasureできた

型に厳しいことで有名な言語であるStandard MLで C++でよく使われる,type erasure(型消去)パターンを実現する方法を紹介します. (* 斉藤さんのコメントによる指摘を受けて追記 *) fun op $ (f,x) = f x; infixr 1 $; (* コード中の行頭に - の付いた行はイン…

SMLでJSONをパースする

SML

SML/njにはデフォルトでいろんなライブラリが同梱されていて,なにやら便利そうな雰囲気を出しているものもあるんですが,…ことごとくドキュメントが無いですorz その中でも,ぱっと見でどうにか使えそうなJSONパーサライブラリを紹介.(jsonて2.0っぽいし) 場所…

遅延リストと正格リストを行き来する

SML

結果がインタープリタに表示されなくて残念なことで有名な遅延リストを 任意のタイミングで正格リスト?に変更したり, 逆に正格リストから遅延リストに変換する関数を定義してみました. fun ! (xs : 'a inflist) : 'a list = let fun strict nil = [] | stri…

文字列からintを読み込む

'16.3 書式付き書き出し処理'(SML版printf)の解説読み込み中…. なんだけど他の章に比べて練習問題がほとんど無い.一つだけ地味な問題があるので回答しておく.何回か前に作成した読み込みの関数から, 「整数を読み出してコンテキストも一緒に返す」関数を作る…

SMLのLazyリストプチ改良

以前作ったSMLの遅延リストのコンストラクタを, デフォルトの正格リストに合わせました. これで組み込み(というかtoplevel)で用意されているリストと同じように使用できると思っていた時期が私にもありましたorz datatype 'a inflist = nil | ::: of 'a * 'a…

16.5 簡易URL解析

練習問題16.5.3 への回答. URLの(ものすごく)適当なパーサ?を作ります. コンビネータとかかっこいいことは何もなくて, 単に手書きでゴリゴリ書く問題です. 直前に出てきたreaderを使う練習でしょう.以下のような形式の文法を解析します. url ::= http://dom…

16章 データフォーマッティング

16.2 空白区切りの文字列を読み込んで整数を返す関数を作る. 以下動作の様子 - val f = readInt "123 345 abc"; - f (); (* 呼び出す毎に *) val it = SOME 123 : int option - f (); (* 整数を切り出す *) val it = SOME 345 : int option - f (); val it =…

SMLで遅延リスト

プログラミング言語StandardML入門作者: 大堀淳出版社/メーカー: 共立出版発売日: 2001/09/30メディア: 単行本購入: 1人 クリック: 10回この商品を含むブログ (4件) を見る積ん読だったので知らなそうな箇所を読んでみた. 以下遅延リストまとめと7章(遅延リ…

それ, SMLで出来るの?

SML

PerlとC++にしかできないような気がするアノ機能 http://d.hatena.ne.jp/qnighy/20100124/1264342447 ってどの機能かよく分からんけど, これで出来てると思う. fun op+= (x,n) = let val _ = (x := !x + n) in x end infix 8 += fun incr_test () = let (* …