pierce@golfer.Dayton.NCR.COM (03/24/88)
Sometimes it is very useful to hide some underlying implementation details
when writing systems such as inference engines. Since Scheme doesn't have
ability to handle read macros then is it possible to do
something like the following in a differnet way ?
where "x" is a variable and "?" is a read macro and the "?" read macro
reads the next character, which is "x" and transforms "?X" into
the following list structure (*var* x) . This representation
is useful to the underlying code and the "?x" is useful to
a user to designate unifiable variables in a backward or forward chaining
rule.
Any and all responses are appreciated.
thanks in advance,
Gene Pierce
--Pavel.pa@XEROX.COM (03/25/88)
You preprocess the input from the user, checking each symbol for a first-character of "?" and transforming all such uses into the list you mentioned. Alternatively, you write a parser/scanner for your input language that has nothing to do with the Scheme function READ. I prefer the latter idea myself. To my mind, READ's only legitimate purpose is the reading of real Scheme programs and data. Pavel
gjc@BUCSF.BU.EDU (George J. Carrette) (03/25/88)
(1) if you are implementing your own read/eval/print loop for a random
language you can write your own read, or use that CGOLREAD that
someone on this list may have already ported to scheme.
(1.5) you may be able to get away with a read/mung/eval/print loop.
Just mung the result of read before you pass it along.
I teach just this technique to transform ?x into the result of
(make-variable :name 'x) (common lisp, sigh...) in a problem
set on pattern matching and pattern compilation.
(2) If you have evaluation macros, you can always have them mung
the passed-in-structure without mercy, e.g. using the technique (1.5)
(assert (append ?x () ?x))
(assert (append ?x (?a . ?y) (?a . ?y))
(append ?x ?y ?y))
(3) If you dont have evaluation macros, big deal, just quote the arguments,
(assert '(append ?x () ?x))
as long as can call EVAL or COMPILE yourself there is no loss of
generality.
(4) In drastic situations use strings,
(fortran "FUNCTION F(X,Y)
F = X*Y+SIN(X)
RETURN
END")
Note that FORTRAN 77 uses 'FOO BAR' for strings, so this actually works
ok, without having to escape-quote internal double quotes.
-gjc