(ffi:clines " #include ") (defun atof (a) (* 1.0 (with-input-from-string (in a) (read in)))) (defun c-add (a b) "arguments are ennumerated." (ffi:c-inline (a b) (:float :float) :float "@(return) = #0 + #1;")) (defun c-powf (a b) (ffi:c-inline (a b) (:float :float) :float "@(return) = powf(#0,#1);")) (defun sdl2-atan2 (x y) "returns radians" (ffi:c-inline (y x) (:double :double) :double "SDL_atan2(#0,#1)" :one-liner t)) (defvar *math-form* (list '+ 0 0)) (defvar *ops* (pairlis '("add" "powf" "atan2") `(,#'c-add ,#'c-powf ,#'sdl2-atan2))) (defvar *help-message* `("--op" (key from ,*ops*) "-a" number-1 "-b" number-2 press return)) (defconstant +command-args+ '(("--op" 1 (setq *math-form* (list (cdr (assoc 1 *ops* :test 'equal)) 0 0))) ("-a" 1 (setf (second *math-form*) (atof 1))) ("-b" 1 (setf (third *math-form*) (atof 1))) ("-?" 0 (print *help-message*) :stop) ("*DEFAULT*" 0 (print *help-message*) :stop))) (ext:process-command-args :rules +command-args+) (print `(*math-form* ,*math-form*)) (When (car *math-form*) (print (apply (car *math-form*) (cdr *math-form*)))) (terpri) (si:quit)