Please send questions to
st10@humboldt.edu .
#!/usr/bin/perl -w
#######################################################
# funct_play2
#
# try to permit a CS 131 student to "play" with simple C++
# functions easily. (written for Section 3, HTDP for C++);
# third of hopefully-several such introductory tools related
# to writing functions early; funct_play0 did not prompt for
# signature, purpose, and examples, but funct_play1 and
# funct_play2 do!
# This will add better support for named constants, I hope,
# and better automatic handling of #include's for other
# functions called within this function.
#
# ASSUMPTIONS:
# * you are running this under UNIX/Linux/OS X (or compatible
# environments); it was developed for use on Humboldt's
# cs-server.humboldt.edu
# * you have set $course variable below to be the "nickname"
# for your course (e.g., cis130)
#
# written by: Sharon M. Tuttle, st10@humboldt.edu
# last modified:10-14-10 - trying to change mentions of contracts
# into signatures...
# 03-03-10 - trying to add a return EXIT_SUCCESS
# to the end of the built _ck_expect function
# AND any try_ functions.. (since main's!)
# 10-15-09 - trying to "build in" boolalpha, so get
# true, false output as true, false
# (not 1, 0)
# 10-24-08 - try to fix double-quote bug in check-expect
# tests involving strings...!
# also finally moving all the #include's together
# 10-16-08 - can I kluge a crude check_expect feature?!
# 10-16-08 - trying to fix pwd, now broken after move
# to nrs-labs?! ALSO not deleting little
# program created, for now -- maybe a useful
# example?
#
# 10-09-07 - changed course name to CS 131
# 04-04-07 - removing submission aspect of this version...
# 04-04-07 - adding example named-constant declaration
# syntax (like tool does for C++ function headers)
# 10-12-05 - fixed the test-examples part so that
# fun(x) == true type-expressions work
# 9-13-05 - perhaps SUBMIT the file, instead?
# using a "special" ${course}submit_embeddable?
# 6-05-05 - emailing portion commented out
# 9-14-03
#######################################################
my $tool_name = "funct_play2";
my $version = "10-14-10";
my $course = "cs131";
my $instr_username = "st10";
#----------------------------------------------------------
# subroutine to ensure that a y or n answer is given
#----------------------------------------------------------
sub get_y_or_n
{
chomp(my $response = <STDIN>);
while (($response ne "y") && ($response ne "n"))
{
print "please respond with y or n: ";
chomp($response = <STDIN>);
}
return $response;
}
#------------------------------------------------------------
# subroutine to finish up the message-to-be-submitted (record of student's
# use of this tool) and send it to me;
# (1 parameter: a message you'd like to add to the end of the
# student's record before it is submitted)
#-----------------------------------------------------------
sub finish_record
{
my($closing_note) = @_;
}
sub grab_dependencies
{
my($funct) = @_;
open F_FILE, "< ${funct}\.cpp"
or die "Cannot open ${funct}\.cpp: $!";
while (<F_FILE>)
{
chomp($line = $_);
if (($line =~ /#include "(.*)\.h"/) && ($1 ne $funct))
{
$addl_obj_files .= "$1\.o ";
print "LOOK! $addl_obj_files\n";
&grab_dependencies("$1");
}
}
close F_FILE;
}
#-----
# [email portions commented out 6-5-05, using #email#]
# PART 1: setting up the beginning of an e-mailed record
# of the student's use of this script
#-----
use File::Basename;
print "----------------------------------------------\n";
print "Welcome to the $version version of $tool_name!\n";
print "----------------------------------------------\n";
# grab info about who, where, and when for this execution ---
# to be included in email to me...
chomp(my $who = `whoami`);
# why did these lines start failing when moved to nrs-labs in F08?!
# good thing I don't use them later after all...!
#chomp(my $where_path = `pwd`);
#my $where = basename $where_path;
chomp(my $start_time = `date`);
#-----
# PART 2: is this a NEW function, or one that is being returned to?
# Either way, you can start by getting the name of the function-of-
# interest, I think;
#-----
my $funct_name = "";
my $other_desired_funct_names = "";
my $funct_header = "";
my $also_for_hdr_file = "";
# default include statements that tester program eventually needs, too
my $include_stmts = "#include <iostream>\n#include <cmath>\n";
# removed 10-24-08 -- print at end whenever use
# . "using namespace std;\n\n";
# Will additional .o files be needed for the compilation of the eventual
# test program? OR for this one? Just in case, start that
# empty string here;
my $addl_obj_files = "";
#-----
# PART 3: Are there any existing functions (currently limited
# to the current working directory) that the student wishes to
# be able to use in his/her new function? If so, get their names
# from the student, and set up what is required for their use
# in the new function to come.
#-----
print "\n";
print "Are there any already-created C++ functions (in the current \n";
print " working directory) which you would like to be able to use\n";
print " within your new function?\n";
print " (type y if so, n if not)\n";
print "your answer: ";
my $reply = &get_y_or_n();
# get the names of already-created functions, set up for their use in
# the new function to come
if ($reply eq "y")
{
print "\n";
print "Enter the name of an already-created function (created in the\n";
print " current directory), or q to quit:\n";
print "function name: ";
chomp(my $old_funct = <STDIN>);
while ($old_funct ne "q")
{
my $old_funct_source = "${old_funct}\.cpp";
my $old_funct_hdr = "${old_funct}\.h";
# make sure that the source code for this function exists
if (! -e $old_funct_source)
{
print "\n";
print " There is no source code file $old_funct_source\n";
print " for function $old_funct; this function cannot\n";
print " be used in your new function.\n";
print "\n";
}
# make sure that the header file for this function exists
elsif (! -e $old_funct_hdr)
{
print "\n";
print " There is no header file $old_funct_hdr\n";
print " for function $old_funct; this function cannot\n";
print " be used in your new function.\n";
print "\n";
}
else
{
# if reach here, BOTH the .cpp and .h files exist for
# this function;
# IF there is not currently a .o file for this function,
# attempt to create one;
if (! -e "${old_funct}\.o")
{
my $ret_val = system("g++ -c $old_funct_source");
if (($ret_val != 0) || (! -e "${old_funct}\.o"))
{
print "\n";
print "Beware --- there was a problem trying to create\n";
print " a .o file for $old_funct.\n";
print "\n";
}
}
# at this point, either a .o file exists for this
# function, or we have attempted to create one;
# add #include for this function to those for eventual
# test program for new function
$include_stmts .= "#include \"$old_funct_hdr\"\n";
# add object file for this function for use in eventual
# compilation of eventual test program for new function
$addl_obj_files .= "${old_funct}\.o ";
# add name for this function for use to list in possible-
# functions when testing later
$other_desired_funct_names .= "\n$old_funct";
$header_guts = `cat ${old_funct}.h`;
$funct_guts = `cat ${old_funct}.cpp`;
}
print "\n";
print "Enter the next name of an already-created function (created\n";
print " in the current directory), or q to quit:\n";
print "function name: ";
chomp($old_funct = <STDIN>);
}
}
# print statements verifying that DID build desired #includes and .o
# based on old functions student wants new function to be able to use
#
#print "\n";
#print "AFTER old-funct loop, here are the resulting include statements\n";
#print "and object files:\n";
#
#print "newest set of \#include statements:\n";
#print "--------------------------\n";
#print "$include_stmts";
#print "using namespace std;\n\n";
#print "--------------------------\n";
#
#print "newest set of .o files:\n";
#print "--------------------------\n";
#print "$addl_obj_files\n";
#print "--------------------------\n";
#-----
# PART 4 - finally, let's grab the new function, the whole purpose of
# this script...! 8-)
#-----
# what if you created this function earlier, and are now correcting it?
# You surely don't want to type the purpose, header, etc. in again!
# So --- perhaps we could simply open it, in that case;
print "\n";
print "Is your new function already in a file in the local directory?\n";
print "(answer y or n): ";
chomp($reply = &get_y_or_n());
if ($reply eq "y")
{
print "\n";
print "What is the name of your function?\n";
print "(note: this script assumes this function is in a file in\n";
print " the current working directory named after the function\n";
print " and ending with .cpp)";
print "\n";
print "function name: ";
chomp($funct_name = <STDIN>);
# if a .cpp file with this function's name does not exist ---
# complain and exit
if (! -e "${funct_name}\.cpp")
{
print "\n";
print "Could not find file ${funct_name}.cpp in the current\n";
print " directory --- goodbye.\n";
&finish_record("tried to work with existing function $funct_name" .
" whose .cpp didn't exist");
exit(1);
}
print "\n";
print "what is your preferred text editor? ";
chomp(my $my_editor = <STDIN>);
system("$my_editor ${funct_name}\.cpp");
print "Do you want to edit ${funct_name}\.h?\n";
print "(please enter y or n): ";
$reply = &get_y_or_n();
if ($reply eq "y")
{
system("$my_editor ${funct_name}\.h");
}
$header_guts = `cat ${funct_name}.h`;
$funct_guts = `cat ${funct_name}.cpp`;
print "Proceeding with $tool_name ... type anything followed by\n";
print " enter to continue: ";
$who_cares = <STDIN>;
# KLUGE - to avoid perl complaint about $who_cares non-use
if (0)
{
print "will never reach this, and see $who_cares";
}
}
#--------------------------------------------------
# if reach here --- this is a brand new function.
# prompt them for the necessary function "pieces"
#--------------------------------------------------
else
{
#-----
# design recipe step 2.1: write the SIGNATURE for the function
#-----
print "\n";
print "--- Entering a new function $funct_name ---\n";
print "\n";
print "Enter the name for your new function:\n";
print "Function name: ";
chomp($funct_name = <STDIN>);
print "\n";
print "***** DESIGN RECIPE STEP 2.1: *****\n";
print "Enter the signature comment for the function $funct_name, using format:\n";
print " $funct_name : parameter_type parameter_type ... -> return_type\n";
print "\n";
print "signature: $funct_name : ";
chomp(my $funct_signature = <STDIN>);
# oh, let's tack on a label so they'll KNOW it's the signature...
$funct_signature = "signature: $funct_name : " . $funct_signature;
print "\n";
print "Your signature for $funct_name is:\n";
print "--------------------------------------------------------\n";
print "$funct_signature\n";
print "--------------------------------------------------------\n";
#-----
# design recipe step 2.2: write the PURPOSE STATEMENT for the function
#-----
print "\n";
print "***** DESIGN RECIPE STEP 2.2: *****\n";
print "Enter a purpose statement for the function $funct_name, \n";
print " \"a brief comment of what the function is to compute\" [HtDP,\n";
print " p. 18]\n";
print "(enter a line containing NOTHING but q and typing the Enter key\n";
print " to show when your purpose statement is complete):\n";
print "\n";
print "purpose: ";
my $next_line = <STDIN>; # I want to KEEP the newline, true?
my $purpose_stmt = "purpose: ";
while (! ($next_line =~ /^\s*q\s*$/))
{
$purpose_stmt .= $next_line;
$next_line = <STDIN>;
}
print "\n";
print "Purpose statement:\n";
print "---------------------------------------------------------------\n";
print "$purpose_stmt";
print "---------------------------------------------------------------\n";
#-----
# design recipe step 2.3: write the HEADER for the function
#-----
print "\n";
print "***** DESIGN RECIPE STEP 2.3: *****\n";
print "Enter the header for the function, using the format:\n";
print " return_type $funct_name (param_type param_name, ...)\n";
print "\n";
print "Function header:\n";
chomp($funct_header = <STDIN>);
# not doing much error checking yet --- but can at least make sure that
# the header contains the function name within it *somewhere*!
while (! ($funct_header =~ /$funct_name/))
{
print "\n";
print "A function header must contain the name of the function!\n";
print "Please enter the function header again, including $funct_name\n";
print " this time:\n";
print "Function header:\n";
chomp($funct_header = <STDIN>);
}
print "\n";
print "Your header for $funct_name is:\n";
print "-------------------------------------------------\n";
print "$funct_header\n";
print "-------------------------------------------------\n";
#-----
# design recipe step 3: write EXAMPLES for the function
# (for now, this will just be text put in a comment. Later,
# perhaps I can read it in in such a way as to "plug in" those
# calls into a generated test program?)
#-----
# 10-16-08: trying to ADD a crude form of this...
print "\n";
print "***** DESIGN RECIPE STEP 3: *****\n";
print "Enter at least one example call of function $funct_name\n";
print " including input(s) and the expected output given those\n";
print " input(s); for example,\n";
print " my_funct(3, 4) == 12\n";
print " my_funct(0, 0) == -3\n";
print "(enter a line containing NOTHING but q and typing the Enter key\n";
print " to show when you have entered all of your examples):\n";
print "\n";
print "Examples: ";
# HERE PLEASE - write the BEGINNING of a crude check_expect function?
open CHECKER, "> ${funct_name}_ck_expect.cpp"
or die "Cannot open ${funct_name}_ck_expect.cpp for writing: $!";
print CHECKER "$include_stmts";
print CHECKER "#include \"${funct_name}.h\"\n";
print CHECKER "using namespace std;\n\n";
print CHECKER "\n";
print CHECKER "int main()\n";
print CHECKER "{\n";
print CHECKER " cout << boolalpha;\n";
print CHECKER " cout << endl;\n";
print CHECKER " cout << \"testing $funct_name: true's should mean";
print CHECKER " passed: \" << endl;\n";
print CHECKER " cout << \"";
print CHECKER "---------------------------------------\" << endl;\n";
# get the examples from the user
$next_line = <STDIN>; # I want to KEEP the newline, true?
my $examples = "Examples: ";
while (! ($next_line =~ /^\s*q\s*$/))
{
$examples .= $next_line;
chomp($next_line);
$next_line =~ s/^\s+//;
$next_line =~ s/\s+$//;
# only keep this if any non-blank characters were typed...
if ($next_line ne "")
{
# can we substitute \" for " for any double-quotes in test?
# AH - but ONLY for the 'label', not for the actual CALL...!
$test_expr = $next_line;
# print "test_expr: <" . $test_expr . ">\n";
$next_line =~ s/"/\\"/g;
$test_expr_to_print = $next_line;
# print "test_expr_to_print: <" . $test_expr_to_print . ">\n";
# testing if above really inserts a \ before each "
# print "next_line: <" . $next_line . ">";
# exit(1);
$cout_line = " cout << \"($test_expr_to_print): \" << " .
"($test_expr)";
# print "cout_line: <" . $cout_line . ">";
# exit(1);
print CHECKER $cout_line;
print CHECKER " << endl;\n";
}
$next_line = <STDIN>;
}
print CHECKER " cout << endl;\n";
print CHECKER "\n";
print CHECKER " return EXIT_SUCCESS;\n";
print CHECKER "}\n";
close CHECKER;
print "\n";
print "Examples:\n";
print "---------------------------------------------------------------\n";
print "$examples";
print "---------------------------------------------------------------\n";
#-----
# ASIDE before design recipe step 3 --- any NAMED CONSTANTS you want
# to declare?
#-----
print "\n";
print "BEFORE you type in ${funct_name}'s body --- are there any\n";
print " NEW named constants that you want to CREATE?\n";
print " (answer y or n):\n";
print "\n";
print "your reply: ";
$reply = &get_y_or_n();
while ($reply eq "y")
{
print "\n";
print "type in your new named constant declaration, using the ",
"format:\n";
print " const const_type CONST_NAME = expression;\n";
print "\n";
print "new declaration: \n";
my $new_const_decl = <STDIN>;
$also_for_hdr_file .= $new_const_decl;
print "\n";
print "do you have another named constant declaration?\n";
print " (enter y or n):\n";
print "\n";
print "your reply: ";
$reply = &get_y_or_n();
}
print "\n";
print "NOTE --- if a named constant was already declared for an\n";
print " OLD function that $funct_name calls, then it SHOULD be \n";
print " visible for use in $funct_name, too...\n";
print "(at least, it should be the way that funct_play2 sets these up ---\n";
print " we will discuss SCOPE later, and then perhaps discuss some\n";
print " other const declaration placement options.\n";
#-----
# design recipe steps 4, 5: insert any template you have, and complete
# the BODY of the function
#-----
print "\n";
print "***** DESIGN RECIPE STEPS 4, 5 *****\n";
print "Enter the template/body of the $funct_name (the part following the header),\n";
print " being sure to include the { and } that should enclose it.\n";
print "(enter a line containing NOTHING but q and typing the Enter key\n";
print " to show when ${funct_name}\'s body is complete):\n";
print "\n";
print "Enter body following the header:\n";
print "\n";
print "$funct_header\n";
$next_line = <STDIN>; # I want to KEEP the newline, true?
my $funct_body = "";
while (! ($next_line =~ /^\s*q\s*$/))
{
$funct_body .= $next_line;
$next_line = <STDIN>;
}
print "\n";
print "${funct_name}\'s body:\n";
print "----------------------------------------------------------------\n";
print "$funct_body";
print "----------------------------------------------------------------\n";
#-----
# PART 3c: "build" the .cpp file and .h file for the function,
# and try to compile it
#-----
# create a file to contain the new C++ function
open FUNCT_FILE, "> ${funct_name}\.cpp"
or die "Cannot open ${funct_name}\.cpp for writing: $!";
print FUNCT_FILE "/*--------------------------------------------------\n";
print FUNCT_FILE "created by $who at ";
chomp(my $funct_create_time = `date`);
print FUNCT_FILE "$funct_create_time\n";
print FUNCT_FILE "--------------------------------------------------*/\n";
print FUNCT_FILE "$include_stmts";
# IF user added any named constants, AND I want to add them to
# $funct_name.h, then don't I have to INCLUDE $funct_name.h here,
# too?
# (BUT --- there should ONLY be such if $also_for_hdr_file is NON-empty,
# I think...)
if ($also_for_hdr_file ne "")
{
print FUNCT_FILE "#include \"${funct_name}\.h\"\n";
}
print FUNCT_FILE "using namespace std;\n\n";
print FUNCT_FILE "\n";
print FUNCT_FILE "/*--------------------------------------------------\n";
print FUNCT_FILE " $funct_signature";
print FUNCT_FILE "\n";
print FUNCT_FILE " $purpose_stmt";
print FUNCT_FILE "\n";
print FUNCT_FILE " $examples";
print FUNCT_FILE "--------------------------------------------------*/\n\n";
print FUNCT_FILE "$funct_header\n";
print FUNCT_FILE "$funct_body";
print FUNCT_FILE "\n";
close FUNCT_FILE;
#-----
# since now have function .cpp file --- better create its initial
# .h file, too (so don't have to parse .cpp yet to create it
# later!)
#----
open HDR_FILE, "> ${funct_name}.h"
or die "Cannot open ${funct_name}.h for writing: $!";
print HDR_FILE "/*--------------------------------------------------\n";
print HDR_FILE " header file for function $funct_name\n";
print HDR_FILE " created by $who at ";
chomp(my $hdr_create_time = `date`);
print HDR_FILE "$hdr_create_time\n";
print HDR_FILE "--------------------------------------------------*/\n";
print HDR_FILE '#ifndef' . " ${funct_name}_H\n";
print HDR_FILE '#define' . " ${funct_name}_H\n";
print HDR_FILE "\n";
# JUST in case a string is involved in the header...!
# WILL I REGRET THIS??
print HDR_FILE "#include <string>\n";
print HDR_FILE "using namespace std;\n";
print HDR_FILE "\n";
# and --- we're trying to put any "new" named constant declarations
# here...
# (BUT --- there should ONLY be such if $also_for_hdr_file is NON-empty,
# I think...)
if ($also_for_hdr_file ne "")
{
print HDR_FILE "$also_for_hdr_file\n";
}
print HDR_FILE "$funct_header;\n";
print HDR_FILE "\n";
print HDR_FILE '#endif' . "\n";
close HDR_FILE;
}
#-----
# PART 5 - whew! Have either entered new function, or modified an
# old one --- ready to compile if reach here, either way!
#-----
print "\n";
print "COMPILING ${funct_name}\.cpp...\n";
print "-----------------------------------------------------------------\n";
my $ret_val = system("g++ -c ${funct_name}\.cpp");
# I am hoping very hard that a return value of 0 means the compilation
# was successful;
if ($ret_val == 0)
{
print "${funct_name}\.cpp COMPILED! 8-)\n";
# print "Now you can try to RUN it using expr_play...\n";
# and try to compile ck_expect function, too?
my $ck_ret_val = system(
"g++ -o ${funct_name}_ck_expect ${funct_name}_ck_expect.cpp " .
"$addl_obj_files ${funct_name}\.o");
if ($ck_ret_val != 0)
{
print "\n";
print "NOTE: ${funct_name}_ck_expect.cpp did not compile...\n";
print "\n";
}
}
else
{
print "\n";
print "---------------------------------------------------------\n";
print "${funct_name}\.cpp DIDN'T compile! 8-(\n";
print " (above are the C++ compiler's error messages...)\n";
print "edit ${funct_name}\.cpp and then try $tool_name again,\n";
print " (or call $tool_name again, and tell it function DOES\n";
print " already have a file in the current directory...)\n";
print "\n";
&finish_record(" ${funct_name}.cpp did not successfully compile\n");
exit(1);
}
#-----
# PART 6: enter desired expressions? OR build a program that asks for
# each parameter, and then dynamically calls? (Might the latter be more
# efficient? Each new "expr" using the function then wouldn't require
# another recompile! But, gotta parse out # of arguments --- that's
# for next version, I think.)
#-----
#
# question: actually include the function within the main(), or #include
# a .h file for it? But for the latter, I'd need to create a .h as well
# as a .cpp for each function, and then change the compilation command
# accordingly; hmm.
#
# hm; first, let's just paste the raw code in.
# to do this, I can solicit the header and body, put it in a .cpp file
# named based on the function name, and then use the header to build
# the function definition, and the .cpp file to build the function
# declaration after main() --- right?
# (wonder how slow this'll be? shudder...)
#
# (and I may just #include it, after all, after looking at multi-file
# example in c++_reference directory. Hmm.)
#
# IF they give me a header --- CAN a function declaration include parameter
# names? Can a .h file? (Is this not required, or not allowed?)
# the student must enter the purpose statement for their function
# first --- might this get them into the habit of coming up
# with a purpose statement early on? It's worth a shot...
# before asking for expressions -- ask if they'd like to run
# little ck_expect tester?
print "\n";
print "Would you like to run ${funct_name}_ck_expect?\n";
print " (type y if so, n if not)\n";
print "your answer: ";
my $ck_reply = &get_y_or_n();
if ($ck_reply eq "y")
{
print "\n";
system("${funct_name}_ck_expect");
}
# now that all is set up --- permit expressions to be
# entered for evaluation (hopefully including some
# involving the newly-created functions!)
print "\n";
print "Enter a C++ expression involving:\n$funct_name" .
"$other_desired_funct_names" .
"\n...and type enter\n";
print " (or type q to quit):\n";
chomp(my $expr = <STDIN>);
# shall we create each expression's program in a separate file,
# or not? Hmm... For now, yes.
my $expr_ct = 0;
# keep handling expressions until the user wishes to quit
while ($expr ne 'q')
{
print "\n";
$expr_ct++;
# create a C++ program to execute this expression
open TESTER, "> try_expr$expr_ct.cpp"
or die "Cannot open try_expr$expr_ct.cpp for writing: $!";
# this will include other functions they've mentioned wanting
# to use --- is that okay? THEN need to tack new function's
# .h file, too!
print TESTER "$include_stmts";
print TESTER "#include \"${funct_name}\.h\"\n";
print TESTER "using namespace std;\n\n";
print TESTER "\n";
print TESTER "int main()\n";
print TESTER "{\n";
print TESTER " cout << boolalpha;\n";
# be careful if this is a string expression...!
if ($expr =~ /".*"/)
{
print TESTER " cout << \"value of \" << $expr
<< \": \" << endl;\n";
}
else
{
print TESTER " cout << \"value of $expr: \" << endl;\n";
}
print TESTER " cout << ($expr) << endl;\n";
print TESTER "\n";
print TESTER " return EXIT_SUCCESS;\n";
print TESTER "}\n";
print TESTER "\n";
close TESTER;
# this need to include .o file for new function, doesn't it?
my $ret_val = system("g++ -o try_expr$expr_ct try_expr$expr_ct.cpp " .
"$addl_obj_files ${funct_name}\.o");
# I am hoping very hard that a return value of 0 means the compilation
# was successful;
if ($ret_val == 0)
{
# had to add the ./ to get this to work on nrs-labs, F08?!
system("./try_expr$expr_ct");
}
else
{
print "*****************************************************\n";
print "Are you sure that $expr is truly a C++ arithmetic\n";
print " expression (with no variables)?\n";
print "Chances are good that it is not; the above are C++\n";
print " compiler messages. Save them and show them to \n";
print " your prof if you have questions.\n";
print "*****************************************************\n";
}
# save a record of this attempt (to be submitted to me at the
# end of this loop...)
my $when = `date`;
# clean up --- remove latest expression's C++ files
# 10-16-08 - COMMENTING OUT for now -- maybe resulting file is an
# interesting example?
# unlink "try_expr$expr_ct.cpp";
# if ($ret_val == 0)
# {
# unlink "try_expr$expr_ct";
# }
print "\nEnter next C++ expression and type enter\n";
print " (or type q to quit):\n";
chomp($expr = <STDIN>);
}
&finish_record("reached end of $tool_name script");
print "\nQuitting $tool_name ... goodbye.\n\n";
# end of funct_play2