home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / f / ilisp-2.lbr / EDIT.LZP / EDIT.LSP
Encoding:
Text File  |  1993-10-26  |  7.8 KB  |  40 lines

  1. (QUOTE iLISP-Library-File)
  2. 7600
  3.       (QUOTE %(C%)% Copyright% by% Computing% Insights,% 1983)
  4.                             
  5. ;(QUOTE (((EDIT X) - The Lisp List Editor) (TYPE: %     MACRO) (ARGUMENT: %     X - A Literal Atom with a list or EXPR value) (VALUE: %     X) (SIDE EFFECTS: Invokes the list editor on a copy of (DEFEXP X) ,) (%     i.e. on an expression which defines X, and evaluates) (%     the result of the editing.) (ERRORS: %     None) (EXAMPLES:) ((EDIT EXEC) - invokes the editor on the expression:) (%     (DEFINE EXEC (QUOTE (PRINT (EVAL (READ)))))) ((EDIT EDIT) - invokes the editor on the expression:) (%     (MACRO EDIT FORM (EDITL (DEFEXP (CADR FORM)))))))
  6. (MACRO EDIT FORM (EDITL (DEFEXP (CADR FORM))))
  7. (QUOTE ())
  8. ;(QUOTE (((EDITL L) - edit a list) (TYPE: %     EXPR) (ARGUMENT: %     L - a non nil list) (VALUE: %     The edited value of L) (SIDE EFFECTS: Invokes the lisp list editor on a copy of L.) (ERRORS: %     None) (EXAMPLES:) ((SETQ FileFns (EDITL (DIRFILE (QUOTE FILE)))) - Sets the variable FileFns) (% %  to the result of editing a list of the functions on the file FILE.) ((EDITL (QUOTE (A B C))) - lets you edit the list (A B C) . The value is the) (% %  new list.)))
  9. (DEFINE EDITL (X) (IF (LISTP X) (LETSYS ((PROMPT 42) (PROMPT1 43) (OUTPUT (QUOTE CON:)) (INPUT (QUOTE CON:)) (LINELENGTH 80) (SYNTAB) (PRINTLEVEL 2)) (SYNTAX (QUOTE #) 7) (SYNTAX (QUOTE %;) 0) (CAR (LAST (Edit1 (LIST (COPY X)) () ID)))) X))
  10. (QUOTE ())
  11. ;(QUOTE (((EditMove CHAIN COM) - the editor%'s move operation) (ARGUMENTS: CHAIN - the editor chain) (% % % % % % % % % %  COM - a number 0 <= COM <= (LENGTH (CAR CHAIN))) (VALUE: A new value for CHAIN) (DESCRIPTION: If COM = 0, EditMove returns (CDR CHAIN) , i.e. it) (% %  moves up the chain. Otherwise it returns (CONS (NTH CHAIN COM) CHAIN) ,) (% %  i.e. it adds the specified element to the edit chain, or, it moves down) (% %  into the current expression.)))
  12. (DEFINE EditMove (CHAIN COM) (COND ((AND (ZEROP COM) (CDR CHAIN))) ((AND (<= 1 COM) (<= COM (LENGTH (CAR CHAIN))) (LISTP (NTH (CAR CHAIN) COM))) (CONS (NTH (CAR CHAIN) COM) CHAIN)) (T (EditErr COM) CHAIN)))
  13. (QUOTE ())
  14. ;(QUOTE (((EditMod CURRENT LENGTH COM AUX A1 A2) - the list modification routine) (ARGUMENTS: CURRENT - the top of the edit chain) (% % % % % % % % % %  LENGTH - the length of CURRENT) (% % % % % % % % % %  COM - the 1st element of the editor command) (% % % % % % % % % %  AUX - the rest of the editor command) (% % % % % % % % % %  A1 - (CAR AUX)) (% % % % % % % % % %  A2 - (CADR AUX)) (VALUE: NOT USEFUL) (DESCRIPTION: Performs the specified modification of CURRENT. EditMod is) (% %  performed solely for its side effect%; its value will vary from one use) (% %  to another.)))
  15. (DEFINE EditMod (CURRENT LENGTH COM AUX A1 A2) (IF (AND (NUMBERP COM) (<= (ABS COM) (ADD1 LENGTH))) (SPLICE CURRENT AUX COM) (SELECTQ COM (T (EditMod CURRENT LENGTH A1 (READLINES) () ())) (N (SPLICE CURRENT AUX (ADD1 LENGTH))) (R (DSUBST A2 A1 CURRENT)) (PI (IF (AND (<= 1 A1) (<= A1 A2) (<= A2 LENGTH)) (LET ((X (CDRS CURRENT (SUB1 A1))) (N (ADD1 (- A2 A1)))) (RPLACD (RPLACA X (CARS X N)) (CDRS X N))) (EditErr COM))) (PO (IF (LISTP (NTH CURRENT A1)) (EditMod CURRENT LENGTH A1 (NTH CURRENT A1) () ()) (EditErr COM))) (EditErr COM))))
  16. (QUOTE ())
  17. ;(QUOTE (((SPLICE L L1 N) - the list splicing function) (ARGUMENTS: L%  - the list to be changed) (% % % % % % % % % %  L1 - the list to be spliced into L) (% % % % % % % % % %  N - the position indicator) (VALUE: NOT USEFUL) (DESCRIPTION: Splices L1 into L at a position indicated by N.) (% %  IF N > 0 then the elements of L1 replace the Nth element of L,) (% %  otherwise, the elements of L1 are inserted before the (ABS N) th) (% %  element of L.)))
  18. (DEFINE SPLICE (L L1 N) (COND ((< N -1) ((LAMBDA (L) (RPLACD L (NCONC L1 (CDR L)))) (CDRS L (- (MINUS N) 2)))) ((< N 1) (RPLACAD L (NCONC L1 (CONS (CAR L) (CDR L))))) ((< N 2) (RPLACAD L (NCONC L1 (CDR L)))) (T (LET ((L (CDRS L (- N 2)))) (RPLACD L (NCONC L1 (CDDR L)))))))
  19. (QUOTE ())
  20. ;(QUOTE (((EditFind CHAIN TARGET XFN) - find the specified expression) (ARGUMENTS: CHAIN - the edit chain) (% % % % % % % % % %  TARGET - the expression to be found) (% % % % % % % % % %  XFN - an escape object to be invoked on the new edit chain) (VALUE: a new edit chain) (DESCRIPTION: Performs a depth first search of the top of the edit chain,) (% %  looking for TARGET. Returns a new CHAIN if it finds TARGET, or just) (% %  CHAIN if it doesn%'t)))
  21. (DEFINE EditFind (CHAIN TARGET XFN) (PROGN (MAPNIL (LAMBDA (X) (IF (LISTP X) (IF (MEMBER TARGET X) (XFN (CONS X CHAIN)) (EditFind (CONS X CHAIN) TARGET XFN)))) (CAR CHAIN)) CHAIN))
  22. (QUOTE ())
  23. ;(QUOTE (((EditSearch CHAIN PAT XFN) - the editor search routine) (ARGUMENTS: CHAIN - the edit chain) (% % % % % % % % % %  PAT - the pattern to search for) (% % % % % % % % % %  XFN - an escape function for aborting via OK!) (VALUE: NOT USEFUL) (DESCRIPTION: Invokes the list editor on each list in (CAR CHAIN) which) (contains PAT.)))
  24. (DEFINE EditSearch (CHAIN PAT XFN) (PROGN (IF (MEMBER PAT (CAR CHAIN)) (Edit1 CHAIN () XFN)) (MAPNIL (LAMBDA (X) (IF (LISTP X) (EditSearch (CONS X CHAIN) PAT XFN))) (CAR CHAIN))))
  25. (QUOTE ())
  26. ;(QUOTE (((READLINES) - read a series of pseudo text lines) (VALUE: A list of lists of atoms) (DESCRIPTION: Repeatedly reads lines of expressions until) (% %  an empty one is encountered.)))
  27. (DEFINE READLINES () (PROGN (FILLBUF) (IF (READP) (CONS (READLINE) (READLINES)))))
  28. (QUOTE ())
  29. ;(QUOTE (((EditErr EXP) - cause an edit error) (ARGUMENT: EXP - the offending expression) (VALUE: NOT USEFUL) (DESCRIPTION: Causes an iLISP error passing along EXP.)))
  30. (DEFINE EditErr (COM) (PROGN (PRIN1 COM) (SPACES 2) (PRINT (QUOTE ?)) (FILLBUF)))
  31. (QUOTE ())
  32. ;(QUOTE (((EditRead CURRENT) - read the next editor command) (ARGUMENT: CURRENT - the top of the edit chain) (VALUE: The next expression on CON:) (DESCRIPTION: If there are no expressions left on CON:,) (% %  EditRead clears the screen and re-presents the current) (% %  expression before perforing a READ. It also binds the) (% %  read macro character # so you can refer to elements of) (% %  the current expression.)))
  33. (DEFINE EditRead (CURRENT) (LET ((# (QUOTE (COPY (NTH CURRENT (READ))))) (N 1)) (IF (NULL (READP)) (MAP (LAMBDA (X) (PROGN (PRIN1 N) (TAB 3) (PRINT X) (SETQ N (ADD1 N)))) CURRENT EQ (CS))) (CAR (ERRORSET T (READ)))))
  34. (QUOTE ())
  35. ;(QUOTE (((Edit1 CHAIN COM XFN) - the iLISP list editor) (TYPE: EXPR) (ARGUMENTS: CHAIN - the edit chain, a list of current expressions) (% % % % % % % % % %  COM - the editor command to be performed) (% % % % % % % % % %  XFN - the escape function to be executed by OK!) (VALUE: Returns CHAIN when COM = OK) (DESCRIPTION: Performs the editing operation described by COM. This may) (% %  involve adding to or modifying CHAIN. If COM = OK then Edit1 simply) (% %  returns CHAIN, otherwise it recalls itself on the new CHAIN calling) (% %  EditRead for the next value of COM.)))
  36. (DEFINE Edit1 (CHAIN COM XFN) (COND ((EQ COM (QUOTE OK)) CHAIN) (T (ERRORSET T (COND ((LISTP COM) (EditMod (CAR CHAIN) (LENGTH (CAR CHAIN)) (CAR COM) (CDR COM) (CADR COM) (CADDR COM))) ((NUMBERP COM) (SETQ CHAIN (EditMove CHAIN COM))) (T (SELECTQ COM (P (PRINTLEVEL (READ))) (PP (CS) (PP (CAR CHAIN)) (DIRIO)) (E (PRINT (EVAL (EditRead (CAR CHAIN)))) (DIRIO)) (^ (SETQ CHAIN (LAST CHAIN))) (F (SETQ CHAIN (CATCH XFN (EditFind CHAIN (EditRead (CAR CHAIN)) XFN)))) (F* (CATCH XFN (EditSearch CHAIN (EditRead (CAR CHAIN)) XFN))) (OK! (XFN CHAIN)) (ABORT! (RESET)) (() ()) (EditErr COM))))) (Edit1 CHAIN (EditRead (CAR CHAIN)) XFN))))
  37. (QUOTE ())
  38. (QUOTE (Edit1 (6956 6379) EditRead (6148 5727) EditErr (5631 5463) READLINES (5366 5175) EditSearch (4981 4644) EditFind (4449 3995) SPLICE (3707 3253) EditMod (2702 2119) EditMove (1898 1433) EDITL (1178 721) EDIT (660 129)))
  39. 
  40.