Hi Enoch,

On 10/11/2012 09:03 PM, Enoch wrote:
> This brings me to a more fundamental question which you, as Amforth's
> BDFL, I feel, need to address.
> 
> Amforth-shell.py turns the use of frt "&34 constant PORTA" definitions
> in the code unnecessary as the shell script does these substitutions for
> you (and saves flash memory). It is great for educational purposes but
> it creates dependence on loading of the code through amforth-shell.py
> only. I think Forth tradition is against that, it was supposed to be
> self contained and operated through a simple terminal...
> 
> What is your recommended practice?

I'm having a similar opinion. amforth-shell.py is impressive, no
question. However, IMHO it blurs the line between "what _I_ know"
and "what the machine knows for me", a state which I'm not too
fond of. Your mileage may vary.

So according to "make one programm do one thing well" I have
created two little perl filters, one will recursively
expand all "include"s in a file and produce the expanded code, the
other is stripping comments and empty lines, just to reduce the
number of transferred bytes (it may destroy ." ..." strings though).
The I use amforth-upload.py to transfer the stripped file.

Since I'm very lazy, I have hacked up a Makefile snippet to do this
for me:

--- Makefile -----------------------------------------------------
...
TARGET=main
CONSOLE=/dev/ttyUSB0
...
upload_file:
        cat $(TARGET).fs | unfold_fs > $(TARGET).fs.unfold
        trim_fs $(TARGET).fs.unfold  > $(TARGET).fs.upload
upload: upload_file
        amforth-upload.py  -t $(CONSOLE) $(TARGET).fs.upload

--- unfold_fs -----------------------------------------------------
#!/usr/bin/perl
# 2007-12-08 EW
#
# filter, read all input, expand lines like
#   "^include filename$"
# with the content found in filename
#
# this is written unfold amforth projects before
# transferring them to the target controller.

use warnings;
use strict;
my $Prog=$0;
my $file="";

my $pattern='^[#]*include\s+(\S+)';
my $comment='\ ---';

my $verbose=0;

while (<>)
{
    if (m/$pattern/)
    {
        $file = "$1";
        print STDERR "  $file\n" if ($verbose);
        if (not -r $file)
        {
            print STDERR "$Prog: file $file not found!\n";
            exit 2;
        }
        print "$comment include begin $file\n";
        system("$Prog $file") == 0 or  die "failed.\n";
        print "$comment include end $file\n";
    }
    else
    {
        print $_;
    }
}
--- trim_fs -------------------------------------------------------
#!/usr/bin/perl
# 2007-12-08 EW
# trim_fs
#
# filter, remove comments, leading and trailing whitespace and empty lines 
#
# this is written to trim unfolded amforth projects

use warnings;
use strict;

while (<>)
{
    chomp;
    s/\\[ \t].*$//;     # remove line comments
    s/\( .* \)//;       # remove inline comments

    #s/^\s+//;          # delete leading whitespace / well no, keep indendation
    s/\s+$//;           # delete trailing whitespace
    s/\b\s+/ /g;        # compress white space after first word
    next if /^$/;       # delete empty lines

    print "$_\n";
}
-------------------------------------------------------------------

If you or anyone on the list likes this, feel free to use or adapt it to
your needs.

Cheers,
Erich


------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
Amforth-devel mailing list for http://amforth.sf.net/
Amforth-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/amforth-devel

Reply via email to