PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/src/web/examples/slbrainfuck.lsp

http://substandard-lisp.googlecode.com/
Lisp | 73 lines | 64 code | 9 blank | 0 comment | 0 complexity | 199dbd7854a0b298ad3e36e757e473fa MD5 | raw file
  1. % slbrainfuck - substandard lisp brainfuck interpreter
  2. % author: Nicky Nickell <nicky.nickell@gmail.com>
  3. (setq *OUTPUT nil)
  4. (setq helloworld "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.")
  5. (de range (start end)
  6. (cond ((greaterp start end)
  7. (cond ((eqn start end) (cons end nil))
  8. (t (cons start (range (sub1 start) end)))))
  9. (t
  10. (cond ((eqn start end) (cons end nil))
  11. (t (cons start (range (add1 start) end)))))))
  12. (de bfseek (bfp from direction for)
  13. (prog nil
  14. (mapc (if (minusp direction)
  15. (range 0 from)
  16. (range from (length bfp)))
  17. (lambda (i)
  18. (if (eqn (nth i bfp) for) (return i))))))
  19. (de bf (bfp bfi)
  20. (let ((ptr 0)
  21. (pc 0)
  22. (bfout nil)
  23. (memory (make-vector 200 0))
  24. (bfin (string-to-list bfi))
  25. (bfprog (string-to-list bfp)))
  26. (prog (op)
  27. top (setq op (nth pc bfprog))
  28. (cond ((eqn op (char !>))
  29. (setq ptr (add1 ptr)))
  30. ((eqn op (char !<))
  31. (setq ptr (sub1 ptr)))
  32. ((eqn op (char !+))
  33. (vector-store memory ptr (add1 (vector-fetch memory ptr))))
  34. ((eqn op (char !-))
  35. (vector-store memory ptr (sub1 (vector-fetch memory ptr))))
  36. ((eqn op (char !.))
  37. (push (vector-fetch memory ptr) bfout))
  38. ((eqn op (char !,))
  39. (vector-store memory ptr (pop bfin)))
  40. ((eqn op (char ![))
  41. (if (zerop (vector-fetch memory ptr))
  42. (setq pc (bfseek bfprog pc 1 (char !])))))
  43. ((eqn op (char !]))
  44. (if (zerop (vector-fetch memory ptr))
  45. nil
  46. (setq pc (bfseek bfprog pc -1 (char ![)))))
  47. ((null op)
  48. (return nil)))
  49. (setq pc (add1 pc))
  50. (go top))
  51. (if (null bfout)
  52. ""
  53. (list2string (reverse bfout)))))
  54. (de bfeval nil
  55. (dom-append (dom-get-element-by-id "out") "output: <br>"
  56. (bf (dom-get-value (dom-get-element-by-id "program"))
  57. (dom-get-value (dom-get-element-by-id "input"))) "<br>"))
  58. (dom-set-title "slbrainfuck")
  59. (dom-append (dom-get-body)
  60. "program: " (dom-create-text '(("id" . "program"))) "<br>"
  61. "input: " (dom-create-text '(("id" . "input"))) "<br>"
  62. (dom-create-button "execute" nil '(("onclick" . (bfeval)))) "<br>"
  63. (dom-create "div" '(("id" . "out"))))
  64. (dom-set-attribute (dom-get-element-by-id "program") "value" helloworld)