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