Source of Nothingness - clispでcgi

* clispcgi

URIのデコード・エンコードが一応完成。
感想メモ
・whileが無くてびっくり
xyzzy lispとの微妙な差が気になる
・(alphanumericp #\あ) => T ってなんだよ!?


(defmacro while (test &body body)
  `(do ()
       ((not ,test))
     ,@body))

(defun uri-unreserved-char-p (c)
  (find c "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~"))

(defun uri-encode (str &optional (enc charset:utf-8))
  (with-output-to-string (s)
    (with-input-from-string (in str)
      (let (c)
        (while (setf c (read-char in nil))
          (cond ((uri-unreserved-char-p c)
                 (format s "~C" c))
                ((char= c #\Space)
                 (format s "~C" #\+))
                (t
                 (format s "~{~A~}"
                         (map 'list
                              #'(lambda (x)
                                  (format nil "%~2,'0x" x))
                              (ext:convert-string-to-bytes (string c) enc))))))
        )
      )
    ))

(defun uri-decode (str &optional (enc charset:utf-8))
  (let ((l nil) c c1 c2)
    (with-input-from-string (in str)
      (while (setf c (read-char in nil))
        (if (char= c #\+) (setf c #\Space))
        (cond ((char/= c #\%)
               (dolist (x (coerce (ext:convert-string-to-bytes (string c) enc) 'list))
                 (push x l)))
              (t
               (and (setf c1 (read-char in nil))
                    (setf c2 (read-char in nil))
                    (push (parse-integer (format nil "~C~C" c1 c2) :radix 16) l))))))
    (ext:convert-string-from-bytes (make-array (length l) :initial-contents (reverse l)) enc)))


(loop while 条件式
      do 実行式)

なのでなくてもいいような

ごもっとも。
ですが、当方はloopマクロになじみがありませんでしたので(^^;

update : 2006-03-04 (Sat) 22:47:41