[NTP] ntpqのreach

NTPのリファレンス実装についてくる ntpq コマンドの -p オプションでは登録した peer の状態が表示される。 remote refid st t when poll reach delay offset jitter ============================================================================== *tok-ntp-ext.asi 17.82.254.14 2 u 576 1024 377 12.519 3.781 2.018 reachに表示されている値は8進数で、1ビットごとにNTPサーバへpollした際の成否を表している。 LSBから順に前回、前々回……と8回前のpollまで成否がわかる。 例えば、前々回のpollが失敗し、それ以外は成功した場合、reachは (11111101)_2 = (375)_8 となる。

[Haskell] 『すごいHaskell たのしく学ぼう!』13.6節の演習

『すごいHaskell たのしく学ぼう!』の13.6節ではリストモナドによる非決定性計算を使ってチェスのナイトが3手で指定したマスに到達できるかを計算する関数が紹介された。 ghci> (6, 2) `canReachIn3` (6, 1) True のように始点と終点を指定すると到達の可否がかえってくる。 節尾の演習にどのように到達できるか教えてくれるようにせよとあったので書いてみる。 import Monad type KnightPos = (Int, Int) type KnightTrack = [KnightPos] moveKnight :: KnightTrack -> [KnightTrack] moveKnight ((c, r) : xs) = map addLog $ filter onBoard [(c+2,r-1), (c+2,r+1), Continue reading [Haskell] 『すごいHaskell たのしく学ぼう!』13.6節の演習

[Lisp] Common LispとSchemeの関数対応表

Common Lispの関数やマクロと対応する機能を持つSchemeの手続きや構文を表にまとめる. 随時更新. Common Lisp Scheme 備考 atom なし (not (pair? obj))を使う consp pair? dolist for-each 記法は異なる mapcan append-map!  SRFI 1 mapcar map multiple-value-bind receive SRFI 8, library syntax null null? nth list-ref nthcdr list-tail SRFI 1ではdrop progn begin rplaca set-car! Continue reading [Lisp] Common LispとSchemeの関数対応表

[コマンド] rlwrap

GNU Rreadlineライブラリは入力の際の便利な機能を提供するライブラリ。これを使用したプログラムでは、入力の際にシェルのようなEmacsキーバインドでの移動や、履歴の呼び出し、カッコの対応の表示などの機能が使えるようになる。 rlwrapはreadlineを使用していないプログラムでもreadlineが使えるように入力をラップするコマンド。 http://utopia.knoware.nl/~hlub/rlwrap/ から入手できる。FreeBSDではportsにあった。 特にLispのREPLではカッコの対応がすぐわかってうれしい。

[並行計算][Scheme][Racket] SRFI 18のmutexとcondition variable

RacketはSRFI 18に対応していることになっているが、mutex-lock!やcondition-variable-signal!などどの手続きはrequireしても定義されない。 mutexやcondition variableのような同期機構ではなく、チャネル通信などの機構を使えということなのだと思うが、ロックを使ったほうが素直に実装できる場合もある。 幸いセマフォはあるようなので、セマフォでmutexやcondition variableを次のように書いた。 ;;; mutex (define (make-mutex) (make-semaphore 1)) (define (mutex-lock! m) (semaphore-wait m)) (define (mutex-unlock-primitive! m) (semaphore-post m)) (define (mutex-unlock! m . rest) (let ((condvar (if (null? rest) #f (car rest)))) (mutex-unlock-primitive! m) (when condvar (condition-variable-wait! Continue reading [並行計算][Scheme][Racket] SRFI 18のmutexとcondition variable

[Scheme][Racket] set-car! set-cdr! が使えない

racket コマンドで起動した Racket では set-car! や set-cdr! が定義されていなかった。 調べてみると Racket ではペアへの破壊的な代入を許さないらしい。 代わりに mcons というデータ構造が用意されていてこちらは set-mcar! や set-mcdr! といった手続きで代入ができる。 R5RS に基づいて書かれた Scheme のプログラムを動かすにはペアを扱う手続きを mcons を使うものに定義し直す必要があるが、すでにそれをするパッケージが用意されている。 > (require r5rs) とすると、set-car! や set-cdr! が定義され、cons で作ったペアに再代入できる。 参考: Getting rid of set-car! and set-cdr!