elisp 函数参数是传值还是传址?

(defstruct person
    (f-name)
	(l-name)
	(a-name))

(setq my (make-person))
(setf (person-f-name my) "san"
      (person-l-name my) "zhang")

(defun show-all-name (person-obj)
    (let ((all (concat (person-l-name person-obj) " " (person-f-name person-obj))))
	    (setf (person-a-name person-obj) (list all all))))

(show-all-name my)

(person-a-name my)
;; 结果是 ("zhang san" "zhang san")

看样子传的是参数地址,那传值怎么传? 如果是传址的话,函数内定义的局部变量 all 在函数show-all-name结束后不就应该回收掉,外面还能获取值?这不是又是传值么?

全是传引用。

LispObject 在实现上是一个指向堆上内存的指针+类型信息组合成的tagged pointer,除了小数字是直接用tagged pointer当usize用直接 表示,大部分对象在堆上分配,由GC管理。

Elisp没有栈分配,大部分managed language都没有明面上的“栈分配”,一般是通过逃逸分析来把不被外部需要的函数内生成的对象放在栈上。(当然Emacs其实也没有逃逸分析)

3赞