Advertisement
Guest User

Untitled

a guest
Jul 12th, 2019
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.41 KB | None | 0 0
  1. (defpackage :df (:use :cl))
  2. (in-package :df)
  3.  
  4. (declaim (inline df-step df-io-step))
  5.  
  6. (declaim (ftype (function
  7.                  ((or character null)
  8.                   number)
  9.                  (values number &optional t t))
  10.                 df-step))
  11.  
  12. (defun df-step (char acc)
  13.   (flet ((adjust (acc) (if (member acc '(-1 256)) 0 acc)))
  14.     (let ((acc (adjust acc)))
  15.       (case char
  16.         ((nil #\h) (values acc nil t))
  17.         (#\i (adjust (1+ acc)))
  18.         (#\d (adjust (1- acc)))
  19.         (#\s (adjust (* acc acc)))
  20.         (#\o (values acc acc))
  21.         (t acc)))))
  22.  
  23. (defun df-io-step (reader writer acc)
  24.   (multiple-value-bind (nacc out end) (df-step (funcall reader) acc)
  25.     (if end
  26.         (values nacc t)
  27.         (prog1 nacc
  28.           (when out
  29.             (funcall writer out))))))
  30.  
  31. (defun df-loop (reader writer &optional (acc 0))
  32.   (loop
  33.      :with stop
  34.      :do (multiple-value-setq (acc stop) (df-io-step reader writer acc))
  35.      :until stop
  36.      :finally (return acc)))
  37.  
  38. (defvar *hello*
  39.   "iisiiiisiiiiiiiioiiiiiiiiiiiiiiiiiiiiiiiiiiiiioiiiiiiiooiiio
  40.   dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
  41.   dddddddddddddddddddodddddddddddddddddddddsddoddddddddoiiiodd
  42.   ddddoddddddddo")
  43.  
  44. (with-output-to-string (out)
  45.   (with-input-from-string (in *hello*)
  46.     (df-loop (lambda () (read-char in nil nil))
  47.              (lambda (c) (write-char (code-char c) out)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement