Refactor some lisp code
This commit is contained in:
		
							parent
							
								
									736e230de9
								
							
						
					
					
						commit
						6cf45219f1
					
				@ -28,6 +28,19 @@
 | 
			
		||||
        (dlambda
 | 
			
		||||
          (:write () (print "something")))))
 | 
			
		||||
 | 
			
		||||
    (defun dlambda-many-named-methods ()
 | 
			
		||||
      (assert-equal
 | 
			
		||||
       '(lambda (&rest arguments)
 | 
			
		||||
          (case (first arguments)
 | 
			
		||||
            (:write1 (apply (lambda () (print "something")) (rest arguments)))
 | 
			
		||||
            (:write2 (apply (lambda () (print "something")) (rest arguments)))
 | 
			
		||||
            (:write3 (apply (lambda () (print "something")) (rest arguments)))))
 | 
			
		||||
 | 
			
		||||
        (dlambda
 | 
			
		||||
          (:write1 () (print "something"))
 | 
			
		||||
          (:write2 () (print "something"))
 | 
			
		||||
          (:write3 () (print "something")))))
 | 
			
		||||
 | 
			
		||||
    (defun dlambda-named-and-default-method ()
 | 
			
		||||
      (assert-equal
 | 
			
		||||
       '(lambda (&rest arguments)
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,7 @@
 | 
			
		||||
(load "functions.lisp")
 | 
			
		||||
 | 
			
		||||
(define-special dlambda (&rest methods)
 | 
			
		||||
  (cons 'lambda
 | 
			
		||||
    (cons '(&rest arguments)
 | 
			
		||||
      (list
 | 
			
		||||
        (cons 'case
 | 
			
		||||
          (cons '(first arguments)
 | 
			
		||||
            (mapcar
 | 
			
		||||
(let
 | 
			
		||||
  ((add-method-clause
 | 
			
		||||
    (lambda (method)
 | 
			
		||||
      (cons (first method)
 | 
			
		||||
        (list
 | 
			
		||||
@ -15,5 +10,12 @@
 | 
			
		||||
              (list
 | 
			
		||||
                (if (equal t (car method))
 | 
			
		||||
                  'arguments
 | 
			
		||||
                            '(rest arguments))))))))
 | 
			
		||||
              methods)))))))
 | 
			
		||||
                  '(rest arguments))))))))))
 | 
			
		||||
 | 
			
		||||
  (define-special dlambda (&rest methods)
 | 
			
		||||
    (cons 'lambda
 | 
			
		||||
      (cons '(&rest arguments)
 | 
			
		||||
        (list
 | 
			
		||||
          (cons 'case
 | 
			
		||||
            (cons '(first arguments)
 | 
			
		||||
              (mapcar add-method-clause methods))))))))
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,3 @@
 | 
			
		||||
(defun extend-null (the-list)
 | 
			
		||||
  (cond
 | 
			
		||||
   ((equal (length the-list) 0) t)
 | 
			
		||||
   (t nil)))
 | 
			
		||||
 | 
			
		||||
(defun mapcar (function-name the-list)
 | 
			
		||||
  (if the-list
 | 
			
		||||
    (cons
 | 
			
		||||
@ -15,9 +10,6 @@
 | 
			
		||||
   (t (cons (funcall function-name the-list)
 | 
			
		||||
       (maplist function-name (rest the-list))))))
 | 
			
		||||
 | 
			
		||||
(defun extend-apply (function-name param-list)
 | 
			
		||||
  (eval (cons function-name param-list)))
 | 
			
		||||
 | 
			
		||||
(defun append (listA listB)
 | 
			
		||||
  (cond
 | 
			
		||||
   ((null listA) listB)
 | 
			
		||||
 | 
			
		||||
@ -7,16 +7,16 @@
 | 
			
		||||
      (dlambda
 | 
			
		||||
 | 
			
		||||
        (:inc ()
 | 
			
		||||
          (setf count (+ count 1)))
 | 
			
		||||
          (setq count (+ count 1)))
 | 
			
		||||
 | 
			
		||||
        (:dec ()
 | 
			
		||||
          (setf count (- count 1)))
 | 
			
		||||
          (setq count (- count 1)))
 | 
			
		||||
 | 
			
		||||
        (:get ()
 | 
			
		||||
          count)
 | 
			
		||||
 | 
			
		||||
        (:set (value)
 | 
			
		||||
          (setf count value))))))
 | 
			
		||||
          (setq count value))))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(defun fruit-counter (initial-count)
 | 
			
		||||
@ -28,46 +28,46 @@
 | 
			
		||||
      (dlambda
 | 
			
		||||
 | 
			
		||||
        (:inc-apples ()
 | 
			
		||||
          (funcall apple-counter :inc))
 | 
			
		||||
          (call apple-counter :inc))
 | 
			
		||||
 | 
			
		||||
        (:dec-apples ()
 | 
			
		||||
          (funcall apple-counter :dec))
 | 
			
		||||
          (call apple-counter :dec))
 | 
			
		||||
 | 
			
		||||
        (:get-apples ()
 | 
			
		||||
          (funcall apple-counter :get))
 | 
			
		||||
          (call apple-counter :get))
 | 
			
		||||
 | 
			
		||||
        (:set-apples (value)
 | 
			
		||||
          (funcall apple-counter :set value))
 | 
			
		||||
          (call apple-counter :set value))
 | 
			
		||||
 | 
			
		||||
        (:inc-bananas ()
 | 
			
		||||
          (funcall banana-counter :inc))
 | 
			
		||||
          (call banana-counter :inc))
 | 
			
		||||
 | 
			
		||||
        (:dec-bananas ()
 | 
			
		||||
          (funcall banana-counter :dec))
 | 
			
		||||
          (call banana-counter :dec))
 | 
			
		||||
 | 
			
		||||
        (:get-bananas ()
 | 
			
		||||
          (funcall banana-counter :get))
 | 
			
		||||
          (call banana-counter :get))
 | 
			
		||||
 | 
			
		||||
        (:set-bananas (value)
 | 
			
		||||
          (funcall banana-counter :set value))
 | 
			
		||||
          (call banana-counter :set value))
 | 
			
		||||
 | 
			
		||||
        (:inc-coconuts ()
 | 
			
		||||
          (funcall coconut-counter :inc))
 | 
			
		||||
          (call coconut-counter :inc))
 | 
			
		||||
 | 
			
		||||
        (:dec-coconuts ()
 | 
			
		||||
          (funcall coconut-counter :dec))
 | 
			
		||||
          (call coconut-counter :dec))
 | 
			
		||||
 | 
			
		||||
        (:get-coconuts ()
 | 
			
		||||
          (funcall coconut-counter :get))
 | 
			
		||||
          (call coconut-counter :get))
 | 
			
		||||
 | 
			
		||||
        (:set-coconuts (value)
 | 
			
		||||
          (funcall coconut-counter :set value))
 | 
			
		||||
          (call coconut-counter :set value))
 | 
			
		||||
 | 
			
		||||
        (t (&rest arguments)
 | 
			
		||||
          (list
 | 
			
		||||
            (list 'apples   (funcall apple-counter :get))
 | 
			
		||||
            (list 'bananas  (funcall banana-counter :get))
 | 
			
		||||
            (list 'coconuts (funcall coconut-counter :get))))))))
 | 
			
		||||
            (list 'apples   (call apple-counter :get))
 | 
			
		||||
            (list 'bananas  (call banana-counter :get))
 | 
			
		||||
            (list 'coconuts (call coconut-counter :get))))))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Create an instance
 | 
			
		||||
@ -82,7 +82,7 @@
 | 
			
		||||
; Another way
 | 
			
		||||
;
 | 
			
		||||
; usage:
 | 
			
		||||
;   ~ (funcall my-fruits2 :set-apples 23)
 | 
			
		||||
;   ~ (call my-fruits2 :set-apples 23)
 | 
			
		||||
;   23
 | 
			
		||||
;
 | 
			
		||||
(setf my-fruits2 (fruit-counter 10000))
 | 
			
		||||
(setq my-fruits2 (fruit-counter 10000))
 | 
			
		||||
 | 
			
		||||
@ -1,37 +1,36 @@
 | 
			
		||||
(load "../lang/dlambda.lisp")
 | 
			
		||||
 | 
			
		||||
(defun counter (initial-count)
 | 
			
		||||
  (let ((count initial-count)
 | 
			
		||||
        (name nil)
 | 
			
		||||
        (this nil))
 | 
			
		||||
  (let ((this) (name)
 | 
			
		||||
        (count initial-count))
 | 
			
		||||
 | 
			
		||||
    (setf name "Counter")
 | 
			
		||||
    (setq name "Counter")
 | 
			
		||||
 | 
			
		||||
    (setf this
 | 
			
		||||
    (setq this
 | 
			
		||||
      (eval
 | 
			
		||||
        (dlambda
 | 
			
		||||
 | 
			
		||||
          (:inc ()
 | 
			
		||||
            (setf count (+ count 1)))
 | 
			
		||||
            (setq count (+ count 1)))
 | 
			
		||||
 | 
			
		||||
          (:inc-3 ()
 | 
			
		||||
            (funcall this :inc)
 | 
			
		||||
            (funcall this :inc)
 | 
			
		||||
            (funcall this :inc))
 | 
			
		||||
            (call this :inc)
 | 
			
		||||
            (call this :inc)
 | 
			
		||||
            (call this :inc))
 | 
			
		||||
 | 
			
		||||
          (:dec ()
 | 
			
		||||
            (setf count (- count 1)))
 | 
			
		||||
            (setq count (- count 1)))
 | 
			
		||||
 | 
			
		||||
          (:dec-3 ()
 | 
			
		||||
            (funcall this :dec)
 | 
			
		||||
            (funcall this :dec)
 | 
			
		||||
            (funcall this :dec))
 | 
			
		||||
            (call this :dec)
 | 
			
		||||
            (call this :dec)
 | 
			
		||||
            (call this :dec))
 | 
			
		||||
 | 
			
		||||
          (:get ()
 | 
			
		||||
            count)
 | 
			
		||||
 | 
			
		||||
          (:set (value)
 | 
			
		||||
            (setf count value))
 | 
			
		||||
            (setq count value))
 | 
			
		||||
 | 
			
		||||
          (t ()
 | 
			
		||||
            (cons name count)))))))
 | 
			
		||||
@ -40,4 +39,4 @@
 | 
			
		||||
(let ((instance (counter 0)))
 | 
			
		||||
  (defun my-counter (&rest args) (apply instance args)))
 | 
			
		||||
 | 
			
		||||
(setf my-counter2 (counter 10000))
 | 
			
		||||
(setq my-counter2 (counter 10000))
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
(defun run-unit-test (unit-test)
 | 
			
		||||
  (if (funcall unit-test)
 | 
			
		||||
  (if (call unit-test)
 | 
			
		||||
    (progn
 | 
			
		||||
      (print (cons t unit-test))
 | 
			
		||||
      t)
 | 
			
		||||
@ -18,7 +18,7 @@
 | 
			
		||||
  (eval (cons 'and (run-test-suite test-suite))))
 | 
			
		||||
 | 
			
		||||
(defun assert (comparison expected actual)
 | 
			
		||||
  (if (funcall comparison expected actual)
 | 
			
		||||
  (if (call comparison expected actual)
 | 
			
		||||
    t
 | 
			
		||||
    (progn
 | 
			
		||||
      (print (list expected 'is 'not comparison actual))
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user