diff options
| -rw-r--r-- | cl-forth.asd | 2 | ||||
| -rw-r--r-- | main.lisp | 131 | 
2 files changed, 109 insertions, 24 deletions
| diff --git a/cl-forth.asd b/cl-forth.asd index f192b5e..6702f90 100644 --- a/cl-forth.asd +++ b/cl-forth.asd @@ -3,7 +3,7 @@    :version "0.1"    :author "Emre Akan"    :licence "MIT" -  :depends-on ("iterate" "cl-fad") +  :depends-on ("iterate" "cl-fad" "clingon")    :serial t    :components ((:file "package")                 (:file "util") @@ -1,25 +1,30 @@  (in-package :cl-forth) -(defun main () -  (let ((args (rest sb-ext:*posix-argv*))) -    (let ((flag (first args))) -      (cond ((string= flag "-c") -             ;; (iter (for (k v) in-hashtable *operations*) -             ;;       (for i from 0) -             ;;       (format t "~s: ~s~%" i k)) -             ;; (let ((tokens (lex-file (second args)))) -             ;;   (format t "~s~%" tokens) -             ;;   (let ((program (prog-from-tokens tokens))) -             ;;     (format t "~s~%" program) -             ;;     (generate-program program :compile t))) -             (generate-program (make-program (second args)) :compile t)) -            ((string= flag "-p") -             (format t "~a" (make-program (second args)))) -            ((string= flag "-t") -             (run-tests)) -            ((string= flag "-s") -             (simulate-program (make-program (second args)))) -            (t (format t "~a is not a valid flag~%" flag)))))) +;; (defun main () +;;   (let ((args (rest sb-ext:*posix-argv*))) +;;     (let ((flag (first args))) +;;       (cond ((string= flag "-c") +;;              ;; (iter (for (k v) in-hashtable *operations*) +;;              ;;       (for i from 0) +;;              ;;       (format t "~s: ~s~%" i k)) +;;              ;; (let ((tokens (lex-file (second args)))) +;;              ;;   (format t "~s~%" tokens) +;;              ;;   (let ((program (prog-from-tokens tokens))) +;;              ;;     (format t "~s~%" program) +;;              ;;     (generate-program program :compile t))) +;;              (generate-program (make-program (second args)) :compile t)) +;;             ((string= flag "-p") +;;              (format t "~a" (make-program (second args)))) +;;             ((string= flag "-t") +;;              (run-tests)) +;;             ((string= flag "-s") +;;              (simulate-program (make-program (second args)))) +;;             ((string= flag "-i") +;;              (simulate-program (with-open-file (str (second args)) +;;                                  (read str)))) +;;             ((string= flag "-e") +;;              (print 5)) +;;             (t (format t "~a is not a valid flag~%" flag))))))  ;; (defun make-exe ()  ;;   (sb-ext:save-lisp-and-die #P"cl-forth" @@ -38,8 +43,8 @@    (generate-program (make-program *example-path*) :path "test/output.asm"                                                    :compile t)) -(defun example-interpret () -  (interpret-program (make-program *example-path*))) +;; (defun example-interpret () +;;   (interpret-program (make-program *example-path*)))  (defun example-run ()    (example-compile) @@ -49,4 +54,84 @@    (iter (for line = (progn (format t "~&> ") (read-line)))          (when (string= line "bye")            (finish)) -        (interpret-program (parse-tokens (lex-line line 0))))) +        (simulate-program (parse-tokens (lex-line line 0))))) + +(defun subcommands () +  (list (clingon:make-command +         :name "derle" +         :description "Dosyadaki programı derle" +         :usage "<dosya-ismi>" +         :handler (lambda (cmd) (generate-program +                            (make-program +                             (car (clingon:command-arguments cmd))) +                            :compile t))) +        (clingon:make-command +         :name "test" +         :description "Testleri çalıştır." +         :handler (lambda (cmd) (declare (ignore cmd)) (run-tests)))  +        (clingon:make-command +         :name "sim" +         :description "Dosyadaki programı simüle et." +         :usage "<dosya-ismi>" +         :handler (lambda (cmd) (simulate-program +                            (make-program +                             (car (clingon:command-arguments cmd)))))))) + +(defun top-level-options () +  (list (clingon:make-option +         :flag +         :description "Programın seçeneklerini göster." +         :short-name #\h +         :key :help))) + +(defun top-level-handler (cmd) +  (clingon:print-usage-and-exit cmd t)) + +(defun top-level-command () +  (clingon:make-command +   :name "cl-forth" +   :description "cl-forth derleyicisi" +   :version "0.1.0" +   :authors '("Emre Akan <akannemre@gmail.com>") +   :options (top-level-options) +   :handler #'top-level-handler +   :sub-commands (subcommands))) + +(defun main () +  (let ((app (top-level-command))) +    (clingon:run app))) + +;; (defun handler (cmd) +;;   (let ((help (clingon:getopt cmd :help)) +;;         (comp (clingon:getopt cmd :compile)) +;;         (sim (clingon:getopt cmd :simulate)) +;;         (test (clingon:getopt cmd :test))) +;;     (cond ((or (not (null help)) (= 0 (length cmd (clingon:command-arguments cmd)))) +;;            (clingon:print-usage (cli-command) t)) +;;           ((not (null compile)) +;;            (generate-program (make-program (second args)) :compile t)) +;;           ((not null sim) +;;            (simulate-program (make-program (second args)))) +;;           ((not null test) +;;            (run-tests))))) + +;; (defun sim-options () +;;   (list (clingon:make-option +;;          :filepath +;;          :description "Dosyadaki programı simüle et." +;;          :short-name #\s +;;          :key :simulate))) + +;; (defun comp-options () +;;   (list (clingon:make-option +;;          :filepath +;;          :description "Dosyadaki programı derle." +;;          :short-name #\c +;;          :key :compile))) + +;; (defun test-options () +;;   (list (clingon:make-option +;;          :flag +;;          :description "Testleri çalıştır." +;;          :short-name #\t +;;          :key :test))) | 
