Variable references in lisp

前端 未结 7 861
灰色年华
灰色年华 2020-11-29 07:04

Another newbie (Common) LISP question:

Basically in most programming languages there\'s a mean for functions to receive references to variables instead of just value

7条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-29 08:06

    Of course, in Lisp you can make your own way make variable references, if you want to. The simplest approach is like this:

    (defstruct reference getter setter)
    
    (defmacro ref (place)
      (let ((new-value (gensym)))
        `(make-reference :getter (lambda () ,place)
                         :setter (lambda (,new-value)
                                   (setf ,place ,new-value)))))
    
    (defun dereference (reference)
      (funcall (reference-getter reference)))
    
    (defun (setf dereference) (new-value reference)
      (funcall (reference-setter reference) new-value))
    

    And then you can use it:

    (defun increase-by-one (var-ref)
      (incf (dereference var-ref)))
    
    (defun test-inc-by-one (n)
      (let ((m n))
        (increase-by-one (ref m))
        (values m n)))
    
    (test-inc-by-one 10) => 11, 10
    

提交回复
热议问题