[Haskell]4つのWord8からWord32に変更する
入力で受け取ったByteStringを32bitの数値で扱いたい。 いろいろ方法がありそうだけど、自前で作成してみた。Cならばunionで4バイト領域にへunsigned charとunsigned longとしてアクセ …
入力で受け取ったByteStringを32bitの数値で扱いたい。 いろいろ方法がありそうだけど、自前で作成してみた。Cならばunionで4バイト領域にへunsigned charとunsigned longとしてアクセ …
もうずいぶん前から、10年近くはなるんじゃないだろうか。いまに至るまでもずうっと考えていて、文章にはしていなかったこと。「関数プログラミング実践入門」という本にそのまま書いてあった。 …ここでの「分かっている …
とても参考になりました。ありがとう! Haskellのリスト操作関数リストアップ(一覧)
Data.Iniを使ってINIファイルを読み書きできるようになりました。ただ、ちょっと不味かろう、使い勝手悪かろうというという後味。 Data.IniをつかってINIファイルを読み書き
ini形式のデータをパースして値を取得できるようにします。また、ファイルが無いときの例外キャッチをできるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
{-# LANGUAGE ScopedTypeVariables #-} module Main where import qualified Data.HashMap as HM import qualified Data.Ini as Ini import qualified Data.Text as Tx import Control.Exception.Safe main::IO () main = do fi < - Ini.readIniFile "test.ini" `catch` (\(e::SomeException) -> do putStrLn $ displayException e return $ Ini.parseIni (Tx.pack "") ) case fi of Left fil -> putStrLn "" Right fir -> do putStrLn $ get (Tx.pack "あ") (Tx.pack "sessionId") fir putStrLn $ get (Tx.pack "い") (Tx.pack "sessionId") fir putStrLn $ getFromStr (Tx.pack "あ") return () where get::Tx.Text -> Tx.Text -> Ini.Ini -> String get section key ini = case Ini.lookupValue section key ini of Left l -> l Right r -> Tx.unpack r getFromStr::Tx.Text -> String getFromStr section = case Ini.parseIni (Tx.pack "[あ]\nhost=localhost\nport=6666\nsessionId=ない") of Left il -> il Right ir -> get section (Tx.pack "sessionId") ir |
[crayon-673ed4f8e …
n3337のRaw-stringをBNFCで定義する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
{- Unicode: Unicode scalar value Basic Multilingual Plane(BMP) = U+0000 - U+FFFF(*) Supplementary Multilingual Plane = U+010000 - U+10FFFF *) Reserved U+D800 - U+DFFF for Surrogate Pair encode rule. => char r-char: Any member of the source character set, except a right parenthesis ) followed by the initial d-char-sequence (which may be empty) followd by a double quote. => (char - [")"]) d-char: Any member of the basic source character set except: space, the left parenthesis (, the right parenthesis ), the backslash \, and the control characters representing horizontal tab, vertical tab, form feed, and newline. => (basic source char - ["() \\\t\v\f\n"]) 2.3 Character sets The basic source character set onsists of 96 characters: the space character, the control characters representing horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters: a-z, A-Z, 0-9 and _{} []#() <>%:; .?*+- /^&|~ !=,\" ' => ["\t\v\f\n0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_{}[]#()<>%:;.?*+-/^&|~!=,\\\"\'"] -} LTest. Test::= Raw_string; token Raw_string ({"u8"} | ["uUL"])? {"R\""} (["\t\n0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_{}[]#()<>%:;.?*+-/^&|~!=,\\\"\'"] - ["() \\\t\n"])* '(' (char - [")"])* ')' (["\t\n0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_{}[]#()<>%:;.?*+-/^&|~!=,\\\"\'"] - ["() \\\t\n"])* '"'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
~$ ./TestRawStr u8R"2sS(あ)6wY" Parse Successful! [Abstract Syntax] LTest (Raw_string "u8R\"2sS(\12354)6wY\"") [Linearized tree] u8R"2sS(あ)6wY" ~$ ~$ ./TestRawStr R"^^(あああ)^^" Parse Successful! [Abstract Syntax] LTest (Raw_string "R\"^^(\12354\12354\12354)^^\"") [Linearized tree] R"^^(あああ)^^" ~$ |
うまくパースしてくれているようで …
ユニコードスカラ値にはサロゲートペアのための領域0xD800-0xDFFFがあり、この範囲は文字を割り当てることがきない。このためcharの範囲からこの部分を外す。 [crayon-673ed4f8e524b302649 …
BNFCのcharは0〜255の文字コードしか扱えない。これをUnicodeの範囲に広げる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ git diff diff --git a/source/src/BNFC/Backend/Haskell/CFtoAlex3.hs b/source/src/BNFC/Backend/Haskell/CFtoAlex3.hs index 054d576..e2b744f 100644 --- a/source/src/BNFC/Backend/Haskell/CFtoAlex3.hs +++ b/source/src/BNFC/Backend/Haskell/CFtoAlex3.hs @@ -63,7 +63,7 @@ cMacros = [ "$s = [a-z\\222-\\255] # [\\247] -- small isolatin1 letter FIXME", "$d = [0-9] -- digit", "$i = [$l $d _ '] -- identifier character", - "$u = [\\0-\\255] -- universal: any character" + "$u = [\\x0000-\\x10FFFF] -- universal: any character" ] rMacros :: CF -> [String] $ |
[crayon-673ed4f8e5312147293331 …
UTF-8へのエンコードは2種類ある。
1 2 3 4 5 6 7 |
module Main (main) where import qualified Codec.Binary.UTF8.String as US main = do s < -getContents print $ US.encode s print $ US.encodeString s |
1 2 3 |
$ ./main あ[227,129,130] "\227\129\130" |
[crayon-673ed4f8e538f953 …
この記事も文字列扱いの理解を助けてくれます。 Haskell Tips(文字列編)