Common Lisp: Working with &rest parameters
Date : March 29 2020, 07:55 AM
will be helpful for those in need The FIRST, SECOND and so on accessor functions are "just" utility functions on top of CAR/CDR or NTH. SO, I guess, the answer to your specific question is "use NTH or ELT" (or build your own specific acccessor functions). If you want, you can define an ELEVENTH as:
|
Common Lisp: This is not a number NIL and &rest parameters
Date : March 29 2020, 07:55 AM
To fix the issue you can do If (second args) is NIL then either args has no second or its second is NIL. However, the third argument to mem-aref must be a number since it is an index. Therein lies the problem. If in your program (second args) is allowed to be NIL (or to not exist), then you'll have to test for that possibility and avoid passing NIL to mem-aref (maybe by leaving out that optional argument). If (second args) is not allowed to be NIL, then the bug is somewhere else in your program. (defun vector-float (&rest args)
(cond
((null (first args))
(return-from vector-float (%vector-float)))
((listp (first args))
(c-arr-to-vector-float (first args)))
((symbolp (second args))
(%vector-float-size (first args)))
((pointerp (first args))
(if (null (second args))
(mem-aref (%vector-float-to-c-array (first args)) :float)
(mem-aref (%vector-float-to-c-array (first args)) :float (second args))))
(t nil)))
|
Using &rest parameters in Common Lisp
Tag : lisp , By : dyarborough
Date : March 29 2020, 07:55 AM
will help you In this answer I'll start by explaining what the problem is, and then show two different approaches to solving it. Understanding the problem (defun func-one (&rest params) ...)
(defun func-two (param-a param-b &rest params) ...)
(defun func-two (param-1 param-2 &rest params)
(format t "~&~D arguments~%param-1: ~S~%param-2: ~S~%params: ~S~%"
(+ 2 (length params))
param-1 param-2 params)
(values))
> (func-two 1 2)
2 arguments
param-1: 1
param-2: 2
params: nil
> (func-two 1 2 3)
3 arguments
param-1: 1
param-2: 2
params: (3)
> (func-two 1 2 3 4)
4 arguments
param-1: 1
param-2: 2
params: (3 4)
> (func-two 1 2 '(3 4))
3 arguments
param-1: 1
param-2: 2
params: ((3 4))
> (apply #'func-two 1 2 '(3 4))
4 arguments
param-1: 1
param-2: 2
params: (3 4)
> (apply #'func-two '(1 2 3 4))
4 arguments
param-1: 1
param-2: 2
params: (3 4)
(defun frobnicate (a b &rest things-to-process) ...)
(apply #'frobnicate this that things-to-process)
(defun frobnicate (a b &rest things-to-process)
;; user convenience function
(frob a b things-to-process))
(defun frob (a b things-to-process)
;; implementation
...)
|
use of &rest and &key at the same time in Common Lisp
Tag : lisp , By : Chris Hanley
Date : March 29 2020, 07:55 AM
wish helps you It's generally not a good idea to mix rest parameters with keyword parameters within a function definition in Common Lisp. If you do so, you should probably consider rewriting the function definition because it can lead to some unexpected behavior. If both &rest and &key appear in a parameter list, then both things happen--all the remaining values, which include the keywords themselves, are gathered into a list that's bound to the &rest parameter, and the appropriate values are also bound to the &key parameters. So the (name "who") keyword parameter is bound to your list of rest parameters by default. if you try to enter the arguments (1 2 3 4 5), you will get an error because they aren't bound to your parameter (name "who"). Here is an example: (defun test (&rest args &key (name "who"))
(list args name))
CL-USER> (test :name "Davis")
((:NAME "Davis") "Davis")
(defmacro hack-test ((&key (name "who")) &body body)
`(list ,name ,@body))
CL-USER> (hack-test (:name "Ricky")
(+ 2 3))
("Ricky" 5)
CL-USER> (hack-test ()
(+ 2 4)
(+ 4 5)
(+ 9 9))
("who" 6 9 18)
CL-USER>
|
common lisp how to transform list of rest parameters
Date : March 29 2020, 07:55 AM
|