Code: Select all
(define (truncate lst size)
	(let ((len (length lst)))
		(if (<= len size)
			(append lst (dup nil (- size len)))
			(chop lst (- len size)))))
(define-macro (define-struct params)
	(let ((items (args))
	      (struct-name (params 0)))
		(eval (expand (quote
			(define (struct-name)
				(truncate (args) n)))
			(list
				(list 'struct-name struct-name)
				(list 'n (length items)))))
		(dolist (item items)
			(eval (expand (quote
				(define (item-getter-setter struct value)
					(if value
						(set-nth idx struct value)
						(struct idx))))
				(list
					(list 'item-getter-setter (sym (string struct-name "-" item)))
					(list 'idx $idx)))))))
Code: Select all
(define-struct (point) x y z)
(setq point1 (point 2 4 6))
(println "point1 = (" (point-x point1) "," (point-y point1) "," (point-z point1) ")")