stack new ry
stack install
- とすると、必要なパッケージを取り入れながら、回るようにしてくれる
- このコマンドライン出力からわかるように、実行可能ファイル ry-exeをユーザのAppData....に作ってくれていて、実行すると、stack new ryコマンドが作った、プロジェクトフォルダryの下のappフォルダの中のMain.hsファイルが実行される
- このMain.hsは書き換えなければ以下のようになっている(Mainモジュールで、Libなるモジュールをimportして、someFuncなる関数を実行するmain関数を定義している。
module Main where
import Lib
main :: IO ()
main = someFunc
- Libはry以下のsrcフォルダにやはりデフォルトでできていて、これが、コンソールに"someFunc"なる文字列を表示させる関数sumeFuncを定義している
module Lib
( someFunc
) where
someFunc :: IO ()
someFunc = putStrLn "someFunc"
- このプロジェクトでパッケージが使いたいなら、ry.cabalを開き、その中の"library"の下の、build-depends:のところにパッケージ名を書き加える。
library
hs-source-dirs: src
exposed-modules: Lib
build-depends: base >= 4.7 && < 5
default-language: Haskell2010
library
hs-source-dirs: src
exposed-modules: Lib
build-depends: base >= 4.7 && < 5
, GLUT
, OpenGL
default-language: Haskell2010
- ただし、Libraryの方でGLUTやらOpenGLを使いたいのか、Main.hsの方で使いたいのかで、書き込むべきbuild-dependsは変わってくる。
- 以下に示す例では、Main.hsにこちらのOpenGLサンプルコードを書き込んだので、executable ry2-exeのbuild-dependsに追加する
executable ry2-exe
hs-source-dirs: app
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base
, ry2
, GLUT
, OpenGL
default-language: Haskell2010
- Main.hsを次のようにする。いろいろなところのコードを試したけれど、このGLUTというのが曲者でInitialize問題というのがある。以下のソースではgetArgsAndInitializeとしているが、OS、GLUTのバージョン、その他でどれが動くのかきれいな答えが無かった・・・。以下はとりあえずUbuntuで動いた。Windows7ではfreeglut問題というのもありこうすれば解決するかも、とは思ったが、試していない
- まあ、stackベースでパッケージを使うための.cabalファイルの操作の練習だったので、(Ubuntuで)動けばよしとしよう
module Main where
import Graphics.UI.GLUT
main = do
getArgsAndInitialize :: IO (String, [String])
initialDisplayMode $= [RGBAMode]
initialWindowSize $= Size 500 500
initialWindowPosition $= Position 200 200
createWindow "Window Name"
displayCallback $= myDisplay
mainLoop
myDisplay = do
clear [ColorBuffer]
renderObject Wireframe ( Teapot 1.0)
flush
stack install
- 実行可能ファイルができるので、実行するとteapotの絵が現れる
- こちらでStackプロジェクトに自作モジュールを加える作業を練習してみる