🔙 Back to Top

Sat Mar 16 11:27:39 JST 2013

幸せになれるかもしれない vimrc

; :vim set wildmode=longest,list,full:

日記

資本主義の理念が原因で、家のネットが使えなくなった
心の中で思わずやったぁと喜んだ.これで自分の時間が
できるぞ!毎月4000円払う権利を放棄して、自由を得た.

だってだってだって

以下、食堂で聞いた会話.

今不安になってU-task見てきたけど無事進級してた
なりさんおはようございます
もう1件いったら遅刻じゃねーかクソ
病院に春って感じのフリルな服着てきたらめっちゃ見られた。
クソゲーだからです
とりあえず5月までは忙しい
もうちょいこっちいて荷物の片付け追い込んでも良いんだけど、そ うすると本当に展覧会周り切れなくなる
やっぱり闘ってる企業人は顔が違うな,それに比べ俺は凧の切れた 糸みたいな感じだわ
姉くれ
ああああああああああああああああああああああああああああああ あああああああああああああああああああああああ
押上行多いな
ぷよぷよ×おにゃのことかうわぁ

Sat Mar 16 13:09:15 JST 2013

fay で遊ぶ

やっと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の型を明記してやると動く.なんで型検査通らないのかな

Sat Mar 16 13:50:18 JST 2013

fay で遊ぶの続き

もうちょっと、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

Sat Mar 16 19:44:42 JST 2013

日記

ああ、もういいです.もう満足しました

部分継続を学ぶ

部分継続便利だなー。 - podhmoの日記

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で作った継続は引数を取らないのね.まずそこから 初めて知った.で、これの有用性は、既にそこにあるループを中断、再開 させること.再帰なんかでこれを実現するには、中身が使ってるパラメータ なんかを全部、再帰の引数にして、中断・再開にはそのパラメータは保存 しておくのだろう.それらをパッと実現できるので、継続は有用である. ということかな.

部分継続を学ぶ2

部分継続チュートリアル

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

うん、まあ、わからん.

部分継続を学ぶ3

Gauche ユーザリファレンス: 9.20 gauche.partcont - 部分継続

初めからココ読むんだった. 分かった気にはなった. そして、ループの外側と内側をreset-shiftで挟むことで、ループを一周だけ 回すような継続が取り出せる、んだろう.