;;; BrainFuck for Emacs ;; BrainFuck Example 1 ;; @ を表示 ;; >++++++[<++++++++++>-]<++++. ;; BrainFuck Example 2 ;; @ を改行しつつ表示 ;; >++++++[<++++++++++>-]<++++ >>+[<++++++++++>-]+++<.<.>.<..>.<...>. ;; BrainFuck Example 3 ;; 入力した回数だけ @ を表示 ;; >++++++[<++++++++++>-]<++++ >>,[<<.>>-] ;; BrainFuck Example 4 ;; "Hello, World" を表示する ;; (let ((str "Hello, World")) ;; (dotimes (i (length str)) ;; (insert (format "%d " (aref str i))))) ;; 72 101 108 108 111 44 32 87 111 114 108 100 ;; >+++++++[<++++++++++>-]<++. > ;; >++++++++++[<++++++++++>-]<+. > ;; >+++++++++++[<++++++++++>-]<--.. > ;; >+++++++++++[<++++++++++>-]<+. > ;; >++++[<++++++++++>-]<++++. > ;; >+++[<++++++++++>-]<++. > ;; >+++++++++[<++++++++++>-]<---. > ;; >+++++++++++[<++++++++++>-]<+. > ;; >+++++++++++[<++++++++++>-]<++++. > ;; >+++++++++++[<++++++++++>-]<--. > ;; >++++++++++[<++++++++++>-]<. > (defun bf (beg end) (interactive "r") (let ((src (buffer-substring-no-properties beg end))) (pop-to-buffer "*Brain Fuck*") (brainfuck-eval src))) (defun brainfuck-eval (src) (let ((memory (make-vector 256 0)) (ptr 0)) (do ((i 0 (incf i))) ((>= i (length src))) (case (aref src i) (?< (decf ptr)) (?> (incf ptr)) (?+ (incf (aref memory ptr))) (?- (decf (aref memory ptr))) (?. (insert (aref memory ptr))) (?, (setf (aref memory ptr) (read))) (?\[ (when (eq (aref memory ptr) 0) (let ((level 1)) (while (not (= level 0)) (incf i) (case (aref src i) (?\[ (incf level)) (?\] (decf level))))))) (?\] (when (not (eq (aref memory ptr) 0)) (let ((level 1)) (while (not (= level 0)) (decf i) (case (aref src i) (?\[ (decf level)) (?\] (incf level)))))))))))