BFコンパイラー
以下のようにonelinerで可能です。
ただしLanguage::BF 0.03が必要です。
CodeRepos経由
で、
- svn co svn.coderepos.org/share/lang/perl/Language-BF
- cd Language-BF/trunk
- perl Makefile.PL
- make install
するか、CPANにVersion 0.03が現れるのをお待ち下さい。
Dan the Brainf.cker
1 2 3 4 | perl -MLanguage::BF \
-e 'print Language::BF->new_from_file(shift)->as_perl' t/hello.bf \
| perl
Hello World!
|
Posted feedbacks - Common Lisp
コードをラベルと命令の列みたいなのにして、 prog の中へ放り込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | (defun compile-bf (str &optional (size 30000) (offset 0))
(let ((tags ()))
(flet ((translate (c)
(case c
(#\> '((incf ptr)))
(#\< '((decf ptr)))
(#\+ '((setf *ptr (logand (1+ *ptr) #xff))))
(#\- '((setf *ptr (logand (1- *ptr) #xff))))
(#\. '((write-char (code-char *ptr))))
(#\, '((setf *ptr (char-code (read-char)))))
(#\[ (let ((t1 (gensym)) (t2 (gensym)))
(setf tags (list* t1 t2 tags))
`(,t1 (if (= *ptr 0) (go ,t2)))))
(#\] (let ((t1 (pop tags)) (t2 (pop tags)))
`((if (/= *ptr 0) (go ,t1)) ,t2))))))
`(symbol-macrolet ((*ptr (aref array ptr)))
(prog ((array ,(make-array size :initial-element 0))
(ptr ,offset))
,@(loop for c across str append (translate c)))))))
;;; test
(eval (compile-bf "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.
+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+."))
|




dankogai
#3886()
Rating0/2=0.00
「どう書く?」でまだ出ていないのが不思議なお題。それがBF処理系。 ここでは、BFで書かれたソースを、同じ言語に変換するコンパイラーを募集します。
私自身、すでにPerlとJavaScriptに関しては http://blog.livedoor.jp/dankogai/archives/50545151.html でやっているのですが、他の言語バージョンも是非見たいので。
Dan the Brainf.ucker
see: Brainfuck - Wikipedia
1 reply [ reply ]