Commit Graph

102 Commits

Author SHA1 Message Date
Kartik Agaram
2caaa7f18f 4272 - type-check variables in non-local spaces
So far we only checked if a single recipe used a variable with multiple
types in any single space. Now we also ensure that the types deduced for
a variable in a space are identical across recipes.
2018-06-25 13:36:27 -07:00
Kartik K. Agaram
7d07cd1de8 3987 2017-09-01 01:50:10 -07:00
Kartik K. Agaram
ec99eb7a2a 3966 2017-07-09 14:34:17 -07:00
Kartik K. Agaram
95f2fe9626 3742 - move instruction.old_name to a later layer
The drawback of this is that we forget to initialize old_name when we
create instructions out of whole cloth in a few places. But this problem
already existed..
2017-02-06 23:44:46 -08:00
Kartik K. Agaram
49620728e8 3707
Be more disciplined about tagging 2 different concepts in the codebase:

a) Use the phrase "later layers" to highlight places where a layer
doesn't have the simplest possible self-contained implementation.

b) Use the word "hook" to point out functions that exist purely to
provide waypoints for extension by future layers.

Since both these only make sense in the pre-tangled representation of
the codebase, using '//:' and '#:' comments to get them stripped out of
tangled output.

(Though '#:' comments still make it to tangled output at the moment.
Let's see if we use it enough to be worth supporting. Scenarios are
pretty unreadable in tangled output anyway.)
2016-12-12 10:07:59 -08:00
Kartik K. Agaram
07c594ebdd 3701
Gracefully handle yet another typo.
2016-11-29 18:33:46 -08:00
Kartik K. Agaram
4b424bb245 3678 - complain about string labels
Thanks Jack Couch for running into this.
2016-11-15 23:29:19 -08:00
Kartik K. Agaram
af7349d50c 3568
Fix syntax highlighting for labels after commit 3552.
2016-10-23 19:18:50 -07:00
Kartik K. Agaram
9a81d7460f 3561 2016-10-22 16:56:07 -07:00
Kartik K. Agaram
ada5eb55cb 3552
Stop requiring jump instructions to explicitly provide a ':label' type
for jump targets.

This has been a source of repeated confusion for my students:
  a) They'd add the ':label' to the label definition rather than the
  jump target (label use)
  b) They'd spend time thinking about whether the initial '+' prefix was
  part of the label name.

In the process I cleaned up a couple of things:

  - the space of names is more cleanly partitioned into labels and
    non-labels (clarifying that '_' and '-' are non-label prefixes)
  - you can't use label names as regular variables anymore
  - you can infer the type of a label just from its name
2016-10-22 12:08:10 -07:00
Kartik K. Agaram
d3c120c1e2 3549
More consistent definitions for jump targets and waypoints.

1. A label is a word starting with something other than a letter or
digit or '$'.

2. A waypoint is a label that starts with '<' and ends with '>'. It has
no restrictions. A recipe can define any number of waypoints, and
recipes can have duplicate waypoints.

3. The special labels '{' and '}' can also be duplicated any number of
times in a recipe. The only constraint on them is that they have to
balance in any recipe. Every '{' must be followed by a matching '}'.

4. All other labels are 'jump targets'. You can't have duplicate jump
targets in a recipe; that would make jumps ambiguous.
2016-10-22 11:28:46 -07:00
Kartik K. Agaram
66abe7c1bd 3539
Always check if next_word() returned an empty string (if it hit eof).

Thanks Rebecca Allard for running into a crash when a .mu file ends with
'{' (without a following newline).

Open question: how to express the constraint that next_word() should
always check if its result is empty? Can *any* type system do that?!
Even the usual constraint that we must use a result isn't iron-clad: you
could save the result in a variable but then ignore it. Unless you go to
Go's extraordinary lengths of considering any dead code an error.
2016-10-21 01:13:27 -07:00
Kartik K. Agaram
6c96a437ce 3522 2016-10-19 22:10:35 -07:00
Kartik K. Agaram
faf521d94c 3441 2016-10-04 09:39:46 -07:00
Kartik K. Agaram
ee6a21cede 3440 2016-10-04 09:36:14 -07:00
Kartik K. Agaram
d731455459 3439 2016-10-04 09:33:17 -07:00
Kartik K. Agaram
8a92ada807 3435 2016-10-04 08:18:43 -07:00
Kartik K. Agaram
d63cddeac0 3364 2016-09-15 13:23:00 -07:00
Kartik K. Agaram
5f05e954ee 3273
Undo 3272. The trouble with creating a new section for constants is that
there's no good place to order it since constants can be initialized
using globals as well as vice versa. And I don't want to add constraints
disallowing either side.

Instead, a new plan: always declare constants in the Globals section
using 'extern const' rather than just 'const', since otherwise constants
implicitly have internal linkage (http://stackoverflow.com/questions/14894698/why-does-extern-const-int-n-not-work-as-expected)
2016-08-28 18:37:57 -07:00
Kartik K. Agaram
c7fde8d4e4 3272
Move global constants into their own section since we seem to be having
trouble linking in 'extern const' variables when manually cleaving mu.cc
into separate compilation units.
2016-08-28 17:08:01 -07:00
Kartik K. Agaram
7fd010710c 3259
Prefer preincrement operators wherever possible. Old versions of
compilers used to be better at optimizing them. Even if we don't care
about performance it's useful to make unary operators look like unary
operators wherever possible, and to distinguish the 'statement form'
which doesn't care about the value of the expression from the
postincrement which usually increments as a side-effect in some larger
computation (and so is worth avoiding except for some common idioms, or
perhaps even there).
2016-08-26 13:40:19 -07:00
Kartik K. Agaram
1625e908ba 3168 - skip loading recipe 'main' in edit/
This is part of efforts to allow students to transition gradually from
the sandbox to running programs directly on the commandline, writing
real scenarios, etc. Running on the commandline requires 'main', but
overriding 'main' would mess up edit/ which is itself a Mu program.
2016-08-12 14:51:53 -07:00
Kartik K. Agaram
8d72e56521 3120
Always show instruction before any transforms in error messages.

This is likely going to make some errors unclear because they *need* to
show the original instruction. But if we don't have tests for those
situations did they ever really work?
2016-07-21 19:22:03 -07:00
Kartik K. Agaram
f28f2636c6 3101 - purge .traces/ dir from repo history
I'd been toying with this idea for some time now given how large the
repo had been growing. The final straw was noticing that people cloning
the repo were having to wait *5 minutes*! That's not good, particularly
for a project with 'tiny' in its description. After purging .traces/
clone time drops to 7 seconds in my tests.

Major issue: some commits refer to .traces/ but don't really change
anything there. That could get confusing :/

Minor issues:

a) I've linked inside commits on GitHub like a half-dozen times online
or over email. Those links are now liable to eventually break. (I seem
to recall GitHub keeps them around as long as they get used at least
once every 60 days, or something like that.)

b) Numbering of commits is messed up because some commits only had
changes to the .traces/ sub-directory.
2016-07-05 00:53:12 -07:00
Kartik K. Agaram
9dcbec398c 2990
Standardize quotes around reagents in error messages.

I'm still sure there's issues. For example, the messages when
type-checking 'copy'. I'm not putting quotes around them because in
layer 60 I end up creating dilated reagents, and then it's a bit much to
have quotes and (two kinds of) brackets. But I'm sure I'm doing that
somewhere..
2016-05-20 22:11:34 -07:00
Kartik K. Agaram
acc4792d2f 2803
Show more thorough information about instructions in the trace, but keep
the original form in error messages.
2016-03-21 02:25:52 -07:00
Kartik K. Agaram
2429c65cce 2799 - new approach to undoing changes in tests
As outlined at the end of 2797. This worked out surprisingly well. Now
the snapshotting code touches fewer layers, and it's much better
behaved, with less need for special-case logic, particularly inside
run_interactive(). 30% slower, but should hopefully not cause any more
bugs.
2016-03-20 00:55:33 -07:00
Kartik K. Agaram
b24eb4766a 2773 - switch to 'int'
This should eradicate the issue of 2771.
2016-03-13 20:26:47 -07:00
Kartik K. Agaram
1ead356219 2735 - define recipes using 'def'
I'm dropping all mention of 'recipe' terminology from the Readme. That
way I hope to avoid further bike-shedding discussions while I very
slowly decide on the right terminology with my students.

I could be smarter in my error messages and use 'recipe' when code uses
it and 'function' otherwise. But what about other words like ingredient?
It would all add complexity that I'm not yet sure is worthwhile. But I
do want separate experiences for veteran programmers reading about Mu on
github and for people learning programming using Mu.
2016-03-08 01:46:47 -08:00
Kartik K. Agaram
1b76245c63 2712 2016-02-26 13:04:55 -08:00
Kartik K. Agaram
a3a0574f17 2709
Only Hide_errors when strictly necessary. In other places let test
failures directly show the unexpected error.
2016-02-25 22:08:27 -08:00
Kartik K. Agaram
a0b9fa55a0 2704 - eradicate all mention of warnings from core 2016-02-25 11:29:42 -08:00
Kartik K. Agaram
5ed9bb135e 2702 2016-02-25 07:58:09 -08:00
Kartik K. Agaram
c4e143d6ea 2681 - drop reagent types from reagent properties
All my attempts at staging this change failed with this humongous commit
that took all day and involved debugging three monstrous bugs. Two of
the bugs had to do with forgetting to check the type name in the
implementation of shape-shifting recipes. Bug #2 in particular would
cause core tests in layer 59 to fail -- only when I loaded up edit/! It
got me to just hack directly on mu.cc until I figured out the cause
(snapshot saved in mu.cc.modified). The problem turned out to be that I
accidentally saved a type ingredient in the Type table during
specialization. Now I know that that can be very bad.

I've checked the traces for any stray type numbers (rather than names).

I also found what might be a bug from last November (labeled TODO), but
we'll verify after this commit.
2016-02-21 20:40:06 -08:00
Kartik K. Agaram
8a3d101e3d 2689 - consistently use s-exp syntax in traces 2016-02-19 14:27:01 -08:00
Kartik K. Agaram
8e1d1add72 2686 2016-02-19 13:57:46 -08:00
Kartik K. Agaram
9f95c7451b 2685
Stack of plans for cleaning up replace_type_ingredients() and a couple
of other things, from main problem to subproblems:

  include type names in the type_tree rather than in the separate properties vector
  make type_tree and string_tree real cons cells, with separate leaf nodes
  redo the vocabulary for dumping various objects:
    do we really need to_string and debug_string?
    can we have a version with *all* information?
    can we have to_string not call debug_string?

This commit nibbles at the edges of the final task, switching from
member method syntax to global function like almost everything else. I'm
mostly using methods just for STL in this project.
2016-02-19 13:42:45 -08:00
Kartik K. Agaram
712b442fab 2648 2016-02-11 17:42:20 -08:00
Kartik K. Agaram
50e0065e1e 2643 2016-02-10 10:20:33 -08:00
Kartik K. Agaram
1cfcb62fa1 2617 - better error messages
When we stash a value, mu does several levels of work for us:

a) First it inserts instructions above the stash to convert the value to
text using to-text-line.
b) to-text-line calls to-text. Both are shape-shifting, so multiple
levels of specialization happen.

To give a good error message, we track the 'stack' of current
specializations at the time of the error, and also check if the
offending instruction at the top-most level looks like it was inserted
while rewriting stash instructions.

Manual example (since booleans can't be stashed at the moment):
  x:boolean <- copy 1/true
  stash x
2016-01-30 12:03:16 -08:00
Kartik K. Agaram
8f0a914953 2603 - bugfix: defining main with commandline args
Pretty hacky fix: we simply suppress static dispatch for main.
2016-01-25 19:32:03 -08:00
Kartik K. Agaram
5a49cfeccb 2553 - keep failed specializations from generating spurious errors
Thanks Caleb Couch.
2015-12-28 13:02:06 -08:00
Kartik K. Agaram
601ff75bc7 three bugs fixed
- notes
bug in edit/ triggers in immutable but not master branch
bug triggered by changes to layer 059: we're finding an unspecialized call to 'length' in 'append_6'

hard to debug because trace isn't complete
just bring out the big hammer: use a new log file

length_2 from recipes.mu is not being deleted (bug #1)
so reload doesn't switch length to length_2 when variant_already_exists (bug #2)
so we end up saving in Recipe for a primitive ordinal
so no valid specialization is found for 'length' (bug #3)

why doesn't it trigger in a non-interactive scenario?
argh, wasn't checking for an empty line at end. ok, confidence restored.
2015-12-15 10:20:41 -08:00
Kartik K. Agaram
71974f15e3 2622 2015-12-13 20:01:42 -08:00
Kartik K. Agaram
3c93ddcbaa 2615
We don't actually need skip_whitespace_AND_comments_BUT_NOT_newline
anywhere except next_word(). Perhaps what I should really do is split
the definition of next_word() into two variants..
2015-12-02 18:17:59 -08:00
Kartik K. Agaram
1f7e3c056c 2614 - still fixing bugs with missing '['
When skipping past some text (usually whitespace, but also commas and
comments) I need to always be aware of whether it's ok to switch to the
next line or not.
2015-12-02 17:11:58 -08:00
Kartik K. Agaram
08cf048f2a 2454
Another gotcha uncovered in the process of sorting out the previous
commit: I keep using eof() but forgetting that there are two other
states an istream can get into. Just never use eof().
2015-11-17 01:21:00 -08:00
Kartik K. Agaram
4135fcd978 2407 - bugfix: parsing recipe headers 2015-11-09 01:31:05 -08:00
Kartik K. Agaram
9867dff44c 2384 - tests pass until layer 54 2015-11-07 08:23:59 -08:00
Kartik K. Agaram
f3760b0f28 2379 - further improvements to map operations
Commands run:

  $ sed -i 's/\([^. (]*\)\.find(\([^)]*\)) != [^.]*\.end()/contains_key(\1, \2)/g' 0[^0]*cc
  $ sed -i 's/\([^. (]*\)\.find(\([^)]*\)) == [^.]*\.end()/!contains_key(\1, \2)/g' 0[^0]*cc
2015-11-06 13:22:30 -08:00