(local posix (require :posix)) (local fcntl (require :posix.fcntl)) (fn from-descriptor [fd] { :read #(posix.unistd.read fd $2) ;XXX needs to check for eof :close #(posix.unistd.close fd) :fileno fd }) (fn open [name direction] (let [flags (match direction :r posix.O_RDONLY :w (+ posix.O_WRONLY posix.O_CREAT)) fd (posix.open name flags)] (fcntl.fcntl fd fcntl.F_SETFL fcntl.O_NONBLOCK) (from-descriptor fd))) { : open : from-descriptor }