Преглед на файлове

Added example for expression manipulation

Samuel W. Flint преди 9 години
родител
ревизия
cb8ac614e4
променени са 1 файла, в които са добавени 47 реда и са изтрити 0 реда
  1. 47 0
      manipulation.org

+ 47 - 0
manipulation.org

@@ -844,6 +844,53 @@ This defines the ~*manipulator-map*~, where the manipulators for various functio
                   ,@body)))))))
 #+END_SRC
 
+
+#+Caption: Expression Manipulation Example
+#+Name: ex-manip-example
+#+BEGIN_SRC lisp :results output raw :exports results :cache yes
+  (load "manipulation")
+  (in-package #:manipulator)
+
+  (format t "#+Caption: Expression Manipulator Expansion~%#+Name: ex-manip-expansion~%#+BEGIN_SRC lisp :exports code~%~a~%#+END_SRC"
+          (macroexpand-1 '(define-operation frobnicate 2 frob)))
+#+END_SRC
+
+#+RESULTS[8b2d6e575e0d168f96d4bba85d6dd90a56c5c5a6]: ex-manip-example
+#+Caption: Expression Manipulator Expansion
+#+Name: ex-manip-expansion
+#+BEGIN_SRC lisp :exports code
+(PROGN
+ (PUSH '(FROB . FROBNICATE) *MANIPULATOR-MAP*)
+ (DEFVAR *MANIPULATORS-FROBNICATE* 'NIL)
+ (DEFUN FROBNICATE-IS-APPLICABLE-P (TYPES EXPRESSION-A EXPRESSION-B)
+   (AND (CLASSIFIED-AS-P EXPRESSION-A (NTH 0 TYPES))
+        (CLASSIFIED-AS-P EXPRESSION-B (NTH 1 TYPES))))
+ (DEFUN GET-FROBNICATE-MANIPULATORS (EXPRESSION-A EXPRESSION-B)
+   (REMOVE-IF #'NULL
+              (MAP 'LIST
+                   #'(LAMBDA (OPTION)
+                       (LET ((TYPES (CAR OPTION)) (NAME (CDR OPTION)))
+                         (IF (FROBNICATE-IS-APPLICABLE-P TYPES EXPRESSION-A
+                              EXPRESSION-B)
+                             NAME)))
+                   *MANIPULATORS-FROBNICATE*)))
+ (DEFUN FROBNICATE (EXPRESSION-A EXPRESSION-B)
+   (FUNCALL (FIRST (GET-FROBNICATE-MANIPULATORS EXPRESSION-A EXPRESSION-B))
+            EXPRESSION-A EXPRESSION-B))
+ (DEFMACRO DEFINE-FROBNICATE-MANIPULATOR
+           ((EXPRESSION-A-TYPE EXPRESSION-B-TYPE) &BODY BODY)
+   (DECLARE (SLIME-INDENT (AS DEFUN)))
+   (LET ((MANIPULATOR-NAME
+          (SYMBOLICATE 'FROBNICATE-MANIPULATOR- EXPRESSION-A-TYPE
+                       EXPRESSION-B-TYPE)))
+     `(PROGN
+       (SETF ,'*MANIPULATORS-FROBNICATE*
+               (APPEND ,'*MANIPULATORS-FROBNICATE*
+                       '(((,EXPRESSION-A-TYPE ,EXPRESSION-B-TYPE)
+                          ,@MANIPULATOR-NAME))))
+       (DEFUN ,MANIPULATOR-NAME ,'(EXPRESSION-A EXPRESSION-B) ,@BODY)))))
+#+END_SRC
+
 ** WORKING External Manipulator
 :PROPERTIES:
 :CREATED:  <2016-05-01 Sun 14:33>