;;; -*- mode: Lisp; Syntax: Common-Lisp; -*- ;;; ;;; Copyright (c) 2009 by the authors. ;;; ;;; See LICENCE for details. (in-package :hu.dwim.projectional-editor) ;;;;;; ;;; Copy projection (def class* projection/copy (projection) ()) ;;;;;; ;;; Copy projection constructors (def (function e) make-projection/copy () (make-instance 'projection/copy)) ;;;;;; ;;; Copy printer (def method project-document (input-document (projection projection/copy)) (bind ((mapping (make-mapping))) (labels ((recurse (input) (or (gethash input (forward-mapping-of mapping)) (prog1-bind output (etypecase input (symbol input) (string (iter (with output = (copy-seq input)) (for index :from 0) (for character :in-sequence input) (insert-mapping mapping `(sequence-position ,input ,index) `(sequence-position ,output ,index)) (insert-mapping mapping `(elt ,input ,index) `(elt ,output ,index)) (insert-mapping mapping `(sequence-position ,input ,(1+ index)) `(sequence-position ,output ,(1+ index))) (finally (return output)))) (cons (cons (recurse (car input)) (recurse (cdr input)))) (standard-object (bind ((class (class-of input))) (prog1-bind clone (allocate-instance class) (dolist (slot (class-slots class)) (setf (slot-value-using-class class clone slot) (recurse (slot-value-using-class class input slot)))))))) (insert-mapping mapping input output))))) (recurse input-document)))) ;;;;;; ;;; Copy reader (def method read-operation (input-document (projection projection/copy) (gesture-queue gesture-queue)) (call-next-method))