Skip to content

Instantly share code, notes, and snippets.

@adacola
Last active August 21, 2018 14:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adacola/98dc5065a59c0e7eaa4e01c103acac59 to your computer and use it in GitHub Desktop.
Save adacola/98dc5065a59c0e7eaa4e01c103acac59 to your computer and use it in GitHub Desktop.
飲酒中に書いたコードであることを表明するコンピュテーション式
open System
type EthanolBuilder() =
let printWarning() = printfn "飲酒中に書いたコードなので危険です!"
member __.Bind(x, f) = printWarning(); f x
member __.Return(x) = x
member __.ReturnFrom(x) = printWarning(); x
member __.Using(x: #IDisposable, f) = try f x finally if x |> box |> isNull |> not then x.Dispose()
member __.Zero() = ()
member __.Combine(_, f) = f()
member __.TryWith(f, g) = try f() with e -> g e
member __.TryFinally(f, g) = try f() finally g()
member __.For(xs, f) = for x in xs do f x
member __.While(c, f) = while c() do f()
member __.Delay(f) = f
member __.Run(f) =
printfn "ここから飲酒中に書いたコードなので危険です!"
let result = f()
printfn "ここまで飲酒中に書いたコード"
result
let ethanol = EthanolBuilder()
let ethanolExample() =
printfn "まだ飲酒してない"
let result = ethanol {
// let! や do! を使うことで警告が出せる
do printfn "1"
let! beer = 1 + 1
do printfn "2"
use wine = { new IDisposable with member __.Dispose() = printfn "disposed" }
do printfn "3"
do! printfn "酒が飲める飲めるぞー酒が飲めるぞー"
do printfn "4"
for x in 1 .. 5 do
printfn "x : %d" x
do printfn "5"
let mutable y = 5
do printfn "6"
while y > 0 do
printfn "y : %d" y
y <- y - 1
do printfn "7"
return! beer + 2
}
printfn "酒が抜けた"
result + 1
(*
> ethanolExample();;
まだ飲酒してない
ここから飲酒中に書いたコードなので危険です!
1
飲酒中に書いたコードなので危険です!
2
3
酒が飲める飲めるぞー酒が飲めるぞー
飲酒中に書いたコードなので危険です!
4
x : 1
x : 2
x : 3
x : 4
x : 5
5
6
y : 5
y : 4
y : 3
y : 2
y : 1
7
飲酒中に書いたコードなので危険です!
disposed
ここまで飲酒中に書いたコード
酒が抜けた
val it : int = 5
*)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment