123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- module bquote; % Support for backquote.
- % Author: Anthony C. Hearn.
- % Copyright (c) 1993 The RAND Corporation. All rights reserved.
- % Lisp parsing case.
- symbolic procedure tokbquote;
- begin
- crchar!* := readch1();
- nxtsym!* := list('backq,rread());
- ttype!* := 3;
- return nxtsym!*
- end;
- put('!`,'tokprop,'tokbquote);
- put('backq,'formfn,'formbquote);
- symbolic procedure formbquote(u,vars,mode); mkbquote cadr u;
- symbolic procedure mkbquote u;
- % Returns the "unevaled" form of u.
- if null u or constantp u then u
- else if atom u then mkquote u
- else if car u eq 'quote
- then if cadr u eq '!# then rederr "Invalid use of # after '"
- else mkquote u
- else if car u eq 'listify then mkbquote cdr u
- else if car u eq '!#
- then if eqcar(cdr u,'!@)
- then if null cdddr u then caddr u
- else list('append,caddr u,mkbquote cdddr u)
- else list('cons,cadr u,mkbquote cddr u)
- else if car u eq '!@ then rederr "Invalid use of @"
- else list('cons,mkbquote car u,mkbquote cdr u);
- % Rlisp parsing case.
- put('backquote,'stat,'bquotstat);
- symbolic procedure bquotstat; list('backquote,rl2l cadr rlis());
- symbolic procedure rl2l u;
- if atom u then u
- else if atom car u then car u . rl2l cdr u
- else if caar u eq 'hash or caar u eq '!#
- then if eqcar(cadar u,'!@)
- then '!# . '!@ . cadr cadar u . rl2l cdr u
- else '!# . cadar u . rl2l cdr u
- else rl2l car u . rl2l cdr u;
- put('backquote,'formfn,'formbquote);
- endmodule;
- end;
|