Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defpackage :df (:use :cl))
- (in-package :df)
- (declaim (inline df-step df-io-step))
- (declaim (ftype (function
- ((or character null)
- number)
- (values number &optional t t))
- df-step))
- (defun df-step (char acc)
- (flet ((adjust (acc) (if (member acc '(-1 256)) 0 acc)))
- (let ((acc (adjust acc)))
- (case char
- ((nil #\h) (values acc nil t))
- (#\i (adjust (1+ acc)))
- (#\d (adjust (1- acc)))
- (#\s (adjust (* acc acc)))
- (#\o (values acc acc))
- (t acc)))))
- (defun df-io-step (reader writer acc)
- (multiple-value-bind (nacc out end) (df-step (funcall reader) acc)
- (if end
- (values nacc t)
- (prog1 nacc
- (when out
- (funcall writer out))))))
- (defun df-loop (reader writer &optional (acc 0))
- (loop
- :with stop
- :do (multiple-value-setq (acc stop) (df-io-step reader writer acc))
- :until stop
- :finally (return acc)))
- (defvar *hello*
- "iisiiiisiiiiiiiioiiiiiiiiiiiiiiiiiiiiiiiiiiiiioiiiiiiiooiiio
- dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
- dddddddddddddddddddodddddddddddddddddddddsddoddddddddoiiiodd
- ddddoddddddddo")
- (with-output-to-string (out)
- (with-input-from-string (in *hello*)
- (df-loop (lambda () (read-char in nil nil))
- (lambda (c) (write-char (code-char c) out)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement