- dartbug.com
- Redirects to the main issue list.
- dartbug.com/new
- Redirects to the new issue template.
- dartbug.com/1199
- Redirects to a specific issue number (in this case 1199, the one I submitted and mentioned in my last blog post).
Fun fact: As of 2011-12-22, the word "array" does not appear in the Dart spec.'This interested me as virtually all languages have arrays and refer to them as such. But sure enough a quick search through the current language spec reveals no results for 'array'. Now, as stated in Seth's blog,
Dart arrays are Lists.I found it an interesting point none the less.
Interestingly enough however, the VM does output an error which refers to arrays. But when compiled to Javascript (via frog or dartc) the errors properly reflects 'lists'. First I'll demonstrate the code and error then I'll actually provide some additional comments regarding the code.
main() { var list = new List(3); // Create an immutable, or 'non-extendable' list list.add(4); // Now try to change it (extend it). }
This results in the following error:
Unhandled exception:
UnsupportedOperationException: Cannot add to a non-extendable array
But when executed on the dartboard we get the following error:
UnsupportedOperationException: Cannot add to a non-extendable list
It surprises me a little that the VM does specifically reference array whereas the code compiled to Javascript, which does have arrays, correctly references a list. There already exists a couple of bug reports. One which I'll only briefly mention, indicates that the word 'array' should be removed from all internal libraries. The second, which I added a comment to regarding the VM specifically is: Issue 1028. This issue aims to be more encompassing removing references from the Libraries as
all references which may become visible.
So you may be wondering why it is that List provides an add method if it just generates an error. Well that's because there are two types of lists. A 'non-extendable' list which is created by passing a size to the constructor, or you can create a list without the optional argument to the constructor which creates an empty list you can extend by adding (or removing) values from. An extendable list can also be created from a list literally such as:
var list = [1, 2, 3];
Note however, that unlike some other languages (such as Ruby), you can not call a method on the List literal. Thus the following is not valid code:
var list = [1, 2, 3].add(4);
You'll receive a warning indicating "expression does not yield a value". But it will compile and run (at least until you try to call a List method on list such as length which will generate a runtime error.
However there is a bug in the add method which I have just discovered. The API for List.add indicates that the return type is 'void' (or no return value). This works as expected in the dartboard (javascript). However in the Dart VM, list.add(value) returns the new size of the list. I have submitted a bug report for it here: Issue 1213.
No comments:
Post a Comment