;;; -*- mode: Lisp; Syntax: Common-Lisp; -*- ;;; ;;; Copyright (c) 2009 by the authors. ;;; ;;; See LICENCE for details. (in-package :hu.dwim.projectional-editor) ;;;;;; ;;; Reference API (def (generic e) reference? (object) (:documentation "Returns TRUE if OBJECT is a reference, otherwise returns FALSE. Purely functional.")) (def (generic e) reference/find-value (document reference) (:documentation "Returns the value of REFERENCE within DOCUMENT. Purely functional.")) (def (generic e) (setf reference/find-value) (new-value document reference) (:documentation "Sets the value of REFERENCE within DOCUMENT to NEW-VALUE. Has side effects on DOCUMENT.")) (def type reference () '(or number symbol string cons)) ;;;;;; ;;; Reference API implementation (def method reference? (object) (typep object 'reference)) (def method reference/find-value (document reference) (bind ((sb-ext::*evaluator-mode* :interpret)) (eval `(bind ((document ',document)) (declare (ignorable document)) ,reference)))) (def method (setf reference/find-value) (new-value document reference) (bind ((sb-ext::*evaluator-mode* :interpret)) (eval `(bind ((document ,document)) (declare (ignorable document)) (setf ,reference ,new-value)))))