Lisp - append Method Combination



Method combination is a powerful technique in CLOS, Common LISP Object System. This technique allows us to combine methods when multiple methods are associated with a generic method. In this chapter, we're exploring how to use append to perform append operation on multiple types of arguments.

Defining combine function with method combination and

An append function is defined using following syntax

; define a generic function combine
(defgeneric combine (x y)
   (:method-combination append))

; combine two lists
(defmethod combine append ((x list) (y list))
   (append x y))
  • defgeneric combine (x y) is used to define a generic function.

  • (:method-combination append) signifies that append method combination is to be used.

  • (defmethod combine append ((x list) (y list)) − check method is specialized to combine two lists.

  • append is essential for method combination. This method combines the elements of the list and returns the combined list.

  • Similarly, we're adding combine() methods to add following parameters −

    • combine list, number

    • combine numer, list

    • combine number, number

Example - Use of append Function

Following is the complete example of an append function.

main.lisp

; define a generic function combine
(defgeneric combine (x y)
   (:method-combination append))

; combine two lists
(defmethod combine append ((x list) (y list))
   (append x y))

; combine a list with a number
(defmethod combine append ((x list) (y number))
   (append x (list y)))

; combine a number with a list
(defmethod combine append ((x number) (y list))
   (append (list x) y))
    
; combine a number with a number as a list
(defmethod combine append ((x number) (y number))
   (append (list x) (list y)))

(format t "combine '(1 2) '(3 4): ~a~%" (combine '(1 2) '(3 4)))
(format t "combine '(1 2) 3: ~a~%" (combine '(1 2) 3))
(format t "combine 1 '(2 3): ~a~%" (combine 1 '(2 3)))
(format t "combine 1 2: ~a~%" (combine 1 2))

Output

When you execute the code, it returns the following result −

combine '(1 2) '(3 4): (1 2 3 4)
combine '(1 2) 3: (1 2 3)
combine 1 '(2 3): (1 2 3)
combine 1 2: (1 2)

Explanation

Generic combine function is called with different argument types. CLOS selects appropriate implementation methods based on argument types and combines the result using append method combination. append method combination treats result of each applicable method as list and perform append opearation on them.

  • If two numbers are passed, each number is converted to a list and then combine using append to get a combined list of numbers.

  • In case of lists, both lists are combined using append function.

  • append method combines the lists in case list and number by converting the number to the list.

Advertisements