cat.sci

cat.sci defines the function cat which prints the source of a macro (function) if it is available. The argument-, type-, and size-checking part is used in Example 4-1.

function [res] = cat(macname)
// Print definition of function 'macname'
// if it has been loaded via a library.

// AUTHOR
//   Lydia van Dijk
//
//   Copyright 1999, 2000 by Lydia van Dijk.
//   cat is free software distributed under the terms
//   of the GNU General Public License, version 2.

[nl, nr] = argn(0);
if nr ~= 1 then
    error("Call with: cat(macro_name)");
end
if type(macname) ~= 10 then
    error("Expecting a string, got a " + typeof(macname));
end
if size(macname, "*") ~= 1 then
    sz = size(macname);
    error("Expecting a scalar, got a " ..
      + sz(1) + "x" + sz(2) + " matrix")
end

[res, err] = evstr(macname);
if err ~= 0 then
    select err
    case 4 then
        disp(macname + " is undefined.");
        return;
    case 25 then
        disp(macname + " is a builtin function");
        return;
    else
        error("unexpected error", err);
    end // select err
end // err ~= 0

name = whereis(macname);
//disp("name = <" + name + ">");
if name == [] then
    disp(macname + " is defined, but its definition is unaccessible");
    clear ans;
    return;
end

cont = string(evstr(name)); // path (1) and contents (2..$) of library
fpath = cont(1);
if part(fpath, 1:4) == "SCI/" then
    fpath = SCI + "/" + part(fpath, 5:length(fpath));
end
fname = fpath + macname + ".sci";

[fh, err] = file("open", fname, "old");
if err ~= 0 then
    error("Could not open file " + fname, err);
end
text = read(fh, -1, 1, "(a)");
file("close", fh);
write(%io(2), text);