(defmacro sum (lst) `(reduce #'+ ,lst)) (defun proper-divisors (n) (when (> n 1) (let ((divisors '()) (limit (floor (sqrt n)))) (loop :for i :from 1 :to limit :when (zerop (mod n i)) :do (progn (push i divisors) (when (/= n (floor n i)) (push (floor n i) divisors)))) (remove-duplicates (sort divisors #'<) :test #'equal)))) (defmacro sum-proper-divisors (n) `(sum (proper-divisors ,n))) (defmacro is-abundant (n) `(> (sum-proper-divisors ,n) ,n)) (defmacro gen-list (min max) `(loop :for n :from ,min :to ,max :collect n)) (defmacro filter (predicate list) `(remove-if-not ,predicate ,list)) (defmacro macro-to-function (macro-name) `(lambda (xs) (,macro-name xs))) (defmacro db (x) `(* 2 ,x)) ((lambda (xs) (db xs)) 2.1) (funcall (macro-to-function db) 2.1) ;; Evaluation Context: ;; ((macro-to-function db) 2.1): This line attempts to call the result of the macro macro-to-function directly as if it were a function. However, since macro-to-function returns a lambda expression, this results in an "illegal function call" error because the macro is not expanded in the context of a function call. ;; (funcall (macro-to-function db) 2.1): In this line, funcall is used to invoke the lambda function returned by macro-to-function. This correctly evaluates the lambda and applies it to 2.1, allowing the macro to be expanded properly. (defmacro abundant-numbers (limit) `(filter (macro-to-function is-abundant) (gen-list 1 ,limit)))

— Me@2024-09-20 11:53:30 PM
.
.
2024.09.21 Saturday (c) All rights reserved by ACHK

You must be logged in to post a comment.