; Run: clisp multi-return-value.cl
; This is to test the multi return pattern.
; It's very convenient for program upgrade.
; Test the multi-return of built-in 'floor' function
(format t "~a~%" (multiple-value-bind (f r)
(floor 130 11)
(list f r)))
(format t "~a~%" (floor 130 11))
; ==== Following is a test to show the power of multi-return ===
; Your original function and how it is called by client
(defun myfunc (a)
"a test function"
a)
(format t "~a~%" (+ (myfunc 1) (myfunc 2)))
; Now we upgrade the function
(defun myfunc2 (a)
"This is the upgrade of 'a test function'"
(values-list (list a (* a 2))))
; The original call is not influenced
(format t "~a~%" (+ (myfunc2 1) (myfunc2 2)))
; You can utilize multiple return values
(format t "~a~%"
(multiple-value-bind (v1 v2)
(myfunc2 2)
(* v1 v2)))
OyBSdW46IGNsaXNwIG11bHRpLXJldHVybi12YWx1ZS5jbCAKOyBUaGlzIGlzIHRvIHRlc3QgdGhlIG11bHRpIHJldHVybiBwYXR0ZXJuLiAKOyBJdCdzIHZlcnkgY29udmVuaWVudCBmb3IgcHJvZ3JhbSB1cGdyYWRlLgoKOyBUZXN0IHRoZSBtdWx0aS1yZXR1cm4gb2YgYnVpbHQtaW4gJ2Zsb29yJyBmdW5jdGlvbgooZm9ybWF0IHQgIn5hfiUiIChtdWx0aXBsZS12YWx1ZS1iaW5kIChmIHIpIAogICAoZmxvb3IgMTMwIDExKQogICAgICAobGlzdCBmIHIpKSkKKGZvcm1hdCB0ICJ+YX4lIiAoZmxvb3IgMTMwIDExKSkKCjsgPT09PSBGb2xsb3dpbmcgaXMgYSB0ZXN0IHRvIHNob3cgdGhlIHBvd2VyIG9mIG11bHRpLXJldHVybiA9PT0KCjsgWW91ciBvcmlnaW5hbCBmdW5jdGlvbiBhbmQgaG93IGl0IGlzIGNhbGxlZCBieSBjbGllbnQKKGRlZnVuIG15ZnVuYyAoYSkKICJhIHRlc3QgZnVuY3Rpb24iCiBhKQooZm9ybWF0IHQgIn5hfiUiICgrIChteWZ1bmMgMSkgKG15ZnVuYyAyKSkpCgo7IE5vdyB3ZSB1cGdyYWRlIHRoZSBmdW5jdGlvbgooZGVmdW4gbXlmdW5jMiAoYSkKICJUaGlzIGlzIHRoZSB1cGdyYWRlIG9mICdhIHRlc3QgZnVuY3Rpb24nIgogKHZhbHVlcy1saXN0IChsaXN0IGEgKCogYSAyKSkpKQo7IFRoZSBvcmlnaW5hbCBjYWxsIGlzIG5vdCBpbmZsdWVuY2VkCihmb3JtYXQgdCAifmF+JSIgKCsgKG15ZnVuYzIgMSkgKG15ZnVuYzIgMikpKQo7IFlvdSBjYW4gdXRpbGl6ZSBtdWx0aXBsZSByZXR1cm4gdmFsdWVzCihmb3JtYXQgdCAifmF+JSIgCiAobXVsdGlwbGUtdmFsdWUtYmluZCAodjEgdjIpIAogIChteWZ1bmMyIDIpCiAgKCogdjEgdjIpKSkK