; :vim set wildmode=longest,list,full:
資本主義の理念が原因で、家のネットが使えなくなった
心の中で思わずやったぁと喜んだ.これで自分の時間が
できるぞ!毎月4000円払う権利を放棄して、自由を得た.
だってだってだって
以下、食堂で聞いた会話.
今不安になってU-task見てきたけど無事進級してた
なりさんおはようございます
もう1件いったら遅刻じゃねーかクソ
病院に春って感じのフリルな服着てきたらめっちゃ見られた。
クソゲーだからです
とりあえず5月までは忙しい
もうちょいこっちいて荷物の片付け追い込んでも良いんだけど、そ うすると本当に展覧会周り切れなくなる
やっぱり闘ってる企業人は顔が違うな,それに比べ俺は凧の切れた 糸みたいな感じだわ
姉くれ
ああああああああああああああああああああああああああああああ あああああああああああああああああああああああ
押上行多いな
ぷよぷよ×おにゃのことかうわぁ
やっとfayをインストールできた. fay :: Haskell -> JavaScript
$ cabal install fay
ってすると
test-framework-th-0.2.4 depends on haskell-src-exts-1.13.5 which failed to install
とか言われて、すぐ上の行に happy 1.7以上が必要とか書いてて、でもhappy はあって、すぐググってPATHに~/.cabal/bin/は追加して.それでもダメで. しょうがナシに
# ln ~/.cabal/bin/happy /bin/
とかやって、ともかくfay入れれた. fayのためのサンプルコードは、fayが全然開発段階なので、githubに置いてある のを見たほうがよくて
https://github.com/faylang/fay/tree/master/examples
$ fay --version
fay 0.14.2.0
$ cat test.hs
module Alert where
import FFI
import Prelude
main :: Fay ()
main = alert $ "Hello, World!"
alert :: String -> Fay ()
alert = ffi "console.log(%1)"
$ fay -O -o test.js test.hs; node test.js
Hello, World!
print という関数は無いみたい.show はあって
先の該当箇所を
main :: Fay ()
main = alert $ show $ "Hello, World!"
とだけして、
$ fay -O -o test.js test.hs; node test.js
{"car":"H","cdr":{"car":"e","cdr":{"car":"l","cdr":{"car":"l","cdr":{"car":"o","cdr":{"car":",","cdr":{"car":" ","cdr":{"car":"W","cdr":{"car":"o","cdr":{"car":"r","cdr":{"car":"l","cdr":{"car":"d","cdr":{"car":"!","cdr":null}}}}}}}}}}}}}
ちゃんとStringが[Char]になってる.しかもたぶん、showはただの#toString じゃなくて、オブジェクトの中身を列挙させてる.組み込みの#toStringは 使い物にならないからね.
型検査の為だけに、またその時だけに、ghcを使うそうです、fayは.
ああ、あと、console.logの型をString->Fay ()
としてるけど、a->Fay ()
と してしまって良いって、思ったんだけど、なんか不可思議なことになるのでやめます.
はっきり言って使い物にならない.そのまま通せば型検査通って 欲しいようなものも通らないし.いや、まあ、私が使いこなせてない だけだろうけど.fayはHaskellじゃなくてHaskellのようなものを 扱うものらしい.
module Alert where
import FFI
import Prelude
main :: Fay ()
main = alert $ show $ a
where
a :: [Int]
a = map (\x -> x*x) [1,2,3]
alert :: String -> Fay ()
alert = ffi "console.log(%1)"
$ fay -O -o test.js test.hs; node test.js
{"car":{"forced":false},"cdr":{"forced":false}}
あー、遅延されてるのか. 出力の前に中身を評価させればいいんだろう.
module Alert where
import FFI
import Prelude
main :: Fay ()
main = alert $ show_list $ a
where
a :: [Int]
a = map (\x -> x*x) [1,2,3]
alert :: String -> Fay ()
alert = ffi "console.log(%1)"
show_list :: [a] -> String
show_list ls = "[" ++ show_list' ls ++ "]"
show_list' ls =
case ls of
[] -> ""
x:xs -> (show x) ++ ", " ++ (show_list' xs)
fay -O -o test.js test.hs
node test.js
[1, 4, 9, ]
まあ、こんなもんで.
case of 使ってるけど、引数でのパターンマッチはできなかった.
module Alert where
import FFI
import Prelude
main :: Fay ()
main = alert $ show $ fact 10
where
fact :: Int -> Int
fact 0 = 1
fact n = n * (fact (n-1))
alert :: String -> Fay ()
alert = ffi "console.log(%1)"
fay -O -o test.js test.hs
node test.js
3628800
なんか、出来るようになってしまった.いみふ.
さっきなんか ambiguous type を連呼してたくせに.わけわからん
module Alert where
import FFI
import Prelude
main :: Fay ()
main = alert $ show $ fact 10
where
fact 0 = 1
fact n = n * fact (n-1)
alert :: String -> Fay ()
alert = ffi "console.log(%1)"
fay -O -o test.js test.hs
fay:
test.hs:7:23:
Ambiguous type variable `a0' in the constraints:
(Eq (Automatic a0)) arising from a use of `fact' at test.hs:7:23-26
(base:GHC.Num.Num (Automatic a0))
arising from the literal `10' at test.hs:7:28-29
(Prelude.Num (Automatic a0))
arising from a use of `fact' at test.hs:7:23-26
Probable fix: add a type signature that fixes these type variable(s)
In the second argument of `($)', namely `fact 10'
In the second argument of `($)', namely `show $ fact 10'
In the expression: alert $ show $ fact 10
make: *** [test] Error 1
できた.できない例が. factの型を明記してやると動く.なんで型検査通らないのかな
もうちょっと、Fayで遊ぶ. こっちから歩み寄る姿勢が大切.
まず公式のドキュメントを正座して朗読する. Home · faylang/fay Wiki
A proper subset of Haskell that compiles to JavaScript.
はい.subsetなのですね.気をつけます.
前回、printが無いとか言ったけど、putStrLnならあった. console.logであると中で定義されてる.show関数はJSONへの変換程度. リストなんかを綺麗に表示するのは自分の手でやるのかな.
なにをどう変換してから型検査に掛けてるのかわからん.
import FFI
import Prelude
main :: Fay ()
main = putStrLn $ list_show $ [ i | i <- [1,2,3]]
list_show :: [Int] -> [Int]
list_show ls = "[" ++ list_show' ls ++ "]"
list_show' [] = ""
list_show' (x:[]) = show x
list_show' (x:xs) = show x ++ ", " ++ list_show' xs
fay -O -o test.js test.hs
fay:
test.hs:5:19:
Couldn't match expected type `Char' with actual type `Int'
Expected type: [Int] -> fay-base-0.14.2.0:Prelude.String
Actual type: [Int] -> [Int]
In the first argument of `($)', namely `list_show'
In the second argument of `($)', namely
`list_show $ [i | i <- [1, 2, 3]]'
test.hs:8:16:
Couldn't match expected type `Int' with actual type `Char'
Expected type: [Int]
Actual type: [Char]
In the first argument of `(++)', namely `"["'
In the expression: "[" ++ list_show' ls ++ "]"
make: *** [test] Error 1
ああ、もういいです.もう満足しました
gosh> (define k #f)
k
gosh> (reset (for-each (^x (shift cc (set! k cc) x)) (list 1 2 3)))
1
gosh> (k)
2
gosh> (k)
3
gosh> (k)
#<undef>
ええっと、reset-shiftで作った継続は引数を取らないのね.まずそこから 初めて知った.で、これの有用性は、既にそこにあるループを中断、再開 させること.再帰なんかでこれを実現するには、中身が使ってるパラメータ なんかを全部、再帰の引数にして、中断・再開にはそのパラメータは保存 しておくのだろう.それらをパッと実現できるので、継続は有用である. ということかな.
gosh> (cons 0 (reset (cons 1 (shift k (cons 2 'null )))))
(0 2 . null)
gosh> k
#<closure (call/pc #f #f)>
gosh> (cons 0 (reset (cons 1 (shift cc (set! k cc) (cons 2 'null )))))
(0 2 . null)
gosh> k
#<closure (call/pc #f #f)>
gosh> (k 3)
(1 . 3)
gosh> (k)
(1 . #<undef>)
引数とるじゃん.取らなくても何かにはなるのね
gosh> (d k)
#<closure (call/pc #f #f)> is an instance of class <procedure>
slots:
required : 0
optional : #t
optcount : 1
locked : #f
currying : #f
constant : #f
info : (call/pc #f #f)
setter : #f
うん、まあ、わからん.
Gauche ユーザリファレンス: 9.20 gauche.partcont - 部分継続
初めからココ読むんだった. 分かった気にはなった. そして、ループの外側と内側をreset-shiftで挟むことで、ループを一周だけ 回すような継続が取り出せる、んだろう.