Haskell 覚書 inkey$を実現する

難しいことを簡単にし,簡単なことを難しくする,などといわれる純粋関数型言語 Haskell。かつてBasic 言語でプログラミングをしていた際によくつかったinkey$関数の実現方法を調べてみた。

inkey$関数とは実行されたときに押されている一文字からなる文字列を返す関数。キーが押されていないときは””が返ってきたはず(30年以上前の記憶なのでうろ覚え)。

以下のコード〜raspberry pi で動けばいいので,とりあえずはこんなコードで〜を macOS で動作確認したところ,おおむね期待通りに動作した。Windows でどうなるかは不明。

import Data.ByteString as BS
import System.IO

main :: IO ()
main = do
 hSetBuffering stdin NoBuffering -- set non buffering mode 
 keyscaned <- BS.hGetNonBlocking stdin 1 -- ::IO ByteString
 if keyscaned == BS.empty
 then main
 else do
 print keyscaned
 main

Haskell メモ

Haskell の習作として Rover Mini の ECU (MEMS)モニタソフトを作りかけている。以下はそのために試行錯誤した際のメモ。順次追記予定。

  1. 16進数表記の文字コードを入力し,文字を得る。
    
     do
       charcode <- readLn :: IO Int
       let command = chr charcode
     

    ECUコマンド発行用。ECUコマンドは基本的に1バイト文字。符号なし1バイト整数を意味する Word8 をこの時点から使おうかと思ったが,chr 関数にWord8を引数とさせる方法を調べるのが面倒だった(多分,こちらの記事が役に立つ。あとで調べる。)ので,とりあえず Int で入力させることを決め打ちにしてこのようなコードに。コンパイラオプション({-# LANGUAGE OverloadedStrings #-}ghc -XOverloadedStrings )を活用する方法を使わなかったのは,単に使うオプション類をできるだけ少なくしたいというコーディングスタイルの趣味の問題。

  2. macOS 機または Raspberry Pi での動作を前提とし,USBシリアル変換ケーブル経由のデータのやりとりをデバイスファイル経由で行う。
    
    result <- BS.hPutNonBlocking h initCommand
    -- 制御が戻ってこない
    result <- IO.fdWrite fd $ B8.unpack initCommand
    -- これで実験してみる
    

    ByteString 内の hPut や hPutNoBuffring では,文字を書き込んでも制御が戻ってこない。下層の Unix システムコールを Haskell で使う Posix.IO の wirteFd あたりを使う必要があるか。Haskell の問題というよりは Unix の使い方の知識の問題。

  3. コンソールで入力した16進の文字コードをECU側に発行し,その反応を,時刻付きでコンソールに表示する。
  4. コンソールに表示した時刻と反応のセットを,第二引数で指定したファイルに書き込む。
  5. シリアル通信が途切れたときのための例外処理の追加。

魚野のつぶやき 今日明日と,名古屋大学で開催。白い発芽ニンニクの水耕房いなぶさんに出ていただいています。▶︎ アグリ…

今日明日と,名古屋大学で開催。白い発芽ニンニクの水耕房いなぶさんに出ていただいています。▶︎ アグリビジネス創出フェア2016 in 東海 -農林水産・食品産業分野における産学官連携によるマッチング促進-(11/28-29開催、愛… twitter.com/i/web/status/8…

魚野のつぶやき 名古屋で12/14に農林水産事業者の所得向上と商工業者の一次産業分野への参入を支援するフォーラムが開…

名古屋で12/14に農林水産事業者の所得向上と商工業者の一次産業分野への参入を支援するフォーラムが開催されます。認定事業者の飯田農園さんも講演。▶ 6次産業化・農商工連携フォーラム in 東海 (中部経済産業局) buff.ly/2fEkfQh

魚野のつぶやき あちらは知らないだろうけど六次産業化の事業者さん支援の競合・目標として念頭にあるのがカゴメ。百貨店量…

あちらは知らないだろうけど六次産業化の事業者さん支援の競合・目標として念頭にあるのがカゴメ。百貨店量販店両方における商品があり,経営資源も豊富。弱点補強されてきたので大手には真似できない要素を追加しなくては▶︎男だけでは強くなれない buff.ly/2gEVCbm

魚野のつぶやき 昨日は研究会で,同じ頃に中国留学していた人の長年に渡る世界を股にかけた大活躍,そして,異国の地で非母…

昨日は研究会で,同じ頃に中国留学していた人の長年に渡る世界を股にかけた大活躍,そして,異国の地で非母語で臨床心理方面の研究活動をしてきた人が新たな活動分野・視野を開拓しようとしている話を聞きました。いずれも大変刺激的で,意義ある内容で,今後,更に展開されるのか,楽しみです。