Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I have had the same problem with the challenge as the gp ever since I read it. I'm a bit perplexed at what exactly Paul's point was.

So I write a templating module for OCaml that lets me beat or tie the Arc challenge. I compile it and never have to look at it again. It becomes part of my toolkit.

What do I have to do in order to win the challenge? Get my module accepted into some standard library? Why would what some language committee decides be important in terms of how expressive the language is?

It doesn't make sense to me. All it shows is that Paul controls Arc and has configured it to deliver small answers to questions that he finds important. I'm not sure it says anything about Arc or any other language for that matter. It might say something about functional versus imperative languages, but perhaps we already knew that?



I agree. The distinction between having a standard library and extending it with a new one is a weak distinction. The only thing it says is that arc handled a specific common function out of the box. What about all the other batteries that are not included in arc vs. language x? If you need to do any one of a hundred normal things that languages do, arc would fall flat on its' face. Try connecting to a database being capable of fetching large result sets, try having robust integration points with a host of common facilities. True pipes, cross platform, concurrency models etc. etc. My point is that any number of languages could offer a dozen challenges that arc would fail, but pg could always add it to his library and declare it standard simply because he's is in control as the authoritative source.


I'm a bit perplexed at what exactly Paul's point was.

What do I have to do in order to win the challenge?

I think the source of your perplexity may be that you're misunderstanding who (or rather what) is being challenged. It's not a contest between people, but between languages. So you don't win it; a language does.

The way a language wins is if you can write the program shorter using it plus some standard libraries. The definition of "standard" doesn't have to be exacting; anything short of a library written specifically to win this contest would be ok; so e.g. any library that existed prior to the challenge obviously would be.


But isn't Arc a library written specifically to win this contest?

A well-balanced "contest" would probably include a bunch of specifics (web, 3d, computation, ...) or stick to generic "programming" ("implement a self-balancing binary tree").

I see the Arc contest as more of something like, "take a look at what happens when you think about a problem space in depth and write a domain-specific language to make solving problems in that space really easy".

The only downside of Arc is that other domains are not as easy to work in. If you design a DSL on top of an existing language, then you don't have that limitation, which is what's good about the Haskell implementation. If I need to write a parser for part of my web app, I can use another nice DSL for that. If I used Arc, I would not have that option.


No, actually. The Arc libraries were written to make general-purpose web apps. I didn't propose the challenge till after the first version of Arc was released. And the way I chose the problem was to think of the simplest stateful web app I could. If this isn't the hello world of stateful web apps, what is?

There's nothing about this problem that's biased towards Arc's strengths. Take input from a form and print it on the next page. Every popular language already had libraries for such basic things.

I suppose Arc was designed to win this contest in the sense that Arc is designed to make programs short, and winning in this contest is measured by brevity. Is that what you meant?


Is that what you meant?

Not really. If I added a condition to the contest that you didn't take into account when writing Arc, Arc would no longer do as well. When the same person designs the programming language and the contest to "prove" it's the best, the contest is likely to prove that his programming language is the best. Not due to malice, but rather because both the language designer and contest designer think exactly the same way (as they are both the same person).


When the same person designs the programming language and the contest to "prove" it's the best, the contest is likely to prove that his programming language is the best.

Ok. Now let's explore (or rather, return to) the question of whether that happened in this case.

Since I was aware people would make this type of criticism when I proposed the challenge, I made a conscious effort to make the problem very generic-- in fact to be the simplest stateful web app I could think of. In your opinion, did I succeed? Is it a simple, generic problem to ask for input on one page and display it on the next? Or is this a complex problem that requires unusual, Arc-specific functionality to solve?


The distinction between 'program' 'language' 'library' 'framework' is just arbitrary though.

Just another vote for 'I have no clue what the point of this is'.

The challenge seems to be:

  * Write a library with helper functions. Like the Arc library.
  * Now you can write a short program that uses that library to do things.
Obviously that's possible in any language, so I don't understand how this measures languages at all.

The example in Arc:

  (defop said req
  (aform [onlink "click here" (pr "you said: " (arg _ "foo"))]
    (input "foo") 
    (submit)))
Well this is a concise way to sum up what you want to do, but that could just be rewritten in any language of your choice. Then the appropriate libraries written. For example, java:

createForm("click here", new Response("you said %foo"), new InputElement("foo"), new SubmitElement());

I think there's more important things to compare in languages. speed, error handling, stability, memory management etc


Here's the critical distinction: you can use only whatever's already provided by the language+libraries you use. That's what I did. I didn't go back and add stuff to the Arc libraries to make the answer to the challenge shorter. I just used what was there already. This will be clear to anyone familiar with the source of HN; all the language features used in the Arc version of the challenge are used throughout news.arc.


Hrmmmm.

But I could just write 'arc' for Java, and the above example would fall out.

The solution for arc doesn't have anything unique in it that you can't do in other languages just as concisely.

So I don't think it says anything at all about the language, it just says how well you designed the interface to helper libraries.

>> "all the language features used in the Arc version of the challenge are used throughout news.arc."

I don't see any 'language features' in the solution for Arc. It's just functions and parameters. They're not language features, they're helper libraries. They may be well designed good libraries, but that's what they are. The language used is irrelevant. You could have written arc in BASIC and the solution would be the same.

Maybe I just don't understand why arc is referred to as a 'language' rather than a framework/library, and why that distinction is important.


But I could just write 'arc' for Java, and the above example would fall out.

In terms of language design, if you were to write news.arc for Java, would you expect a solution to the challenge to just fall out? This probably says more about MzScheme+pg vs Java+you than it does about arc, however.


One language feature that's used here is lexical closures. This would be hard to implement concisely in a language without them.

If you wrote an Arc implementation in Java, then ran the program on top of that system, surely that would count as an instance of Arc winning the the challenge, not Java.


The Java example I gave didn't use them, and is more concise. I think it's pretty readable.


I'm not even sure if you're serious at this point, but the important distinction here is that the hypothetical library function you created to make this work in Java is (like the even shorter version proposed here: http://news.ycombinator.com/item?id=1005199) not one that anyone ever would put in a library. Its only function is this one case. Whereas the Arc version is built by combining highly orthogonal components that can be recombined to solve completely different problems. Do you really not see the difference?


Its only function is this one case. Whereas the Arc version is built by combining highly orthogonal components that can be recombined to solve completely different problems. Do you really not see the difference?

This is why the appropriate test is the ability for an average programmer to put together a DSL for a randomly-selected problem domain: it actually speaks to the power of the language. The characteristics of orthogonality and combinatorial flexibility is what DSLs are made to do. Arc doesn't have a monopoly on them. The only thing that is interesting here is your choice to include web-specific functionality in Arc. I think it's a great choice, but it just doesn't say much about the general expressiveness of the language as a whole.

We may have reached the point here where splitting hairs over DSLs versus included libraries is not going to get anybody anywhere. From what I understand, I would certainly agree that Arc programmers having such easy access to stateless web programming in a highly flexible manner is a great thing for the language.

But I would judge any language by the ability to easily add solutions to other problem domains that are highly orthogonal and flexible, not necessarily by the problem domains that are enabled by default.

Hope that makes sense. I think I finally figured out what your point was.


The Java solution I pasted is "built by combining highly orthogonal components that can be recombined to solve completely different problems".

createForm("click here", new Response("you said %foo"), new InputElement("foo"), new SubmitElement());

Does this not look like a combination of highly orthogonal components that could be recombined to solve a variety of problems?

So no, I can't see any different whatsoever. I'm guessing we'll just have to agree to disagree at this point.


And it used fewer tokens.


This doesn't make sense to me.

You've widened the scope of "language" to its libraries. And that's entirely fair. So, yes, Arc has it "built in", but Arc itself is (IMO) only marginally more mature than the libraries one might invent for (e.g.) Haskell to do the same thing (ok, I'm being a little unfair here, but not that much IMO). And one can invent those libraries for another language and can match Arc in the challenge using those invented libraries -- at least you don't seem to be denying this.

So, then, what's the point? That Arc already has the libraries available? That the Arc libraries meet the challenge? It certainly isn't that those libraries aren't possible in another language. The challenge means (almost) nothing with regards to comparing programming languages as you first implied, and is more about what tools and libraries were invented along with Arc to develop web apps.


And one can invent those libraries for another language and can match Arc in the challenge using those invented libraries -- at least you don't seem to be denying this.

Depends on the language, obviously. It seems unlikely you could in C, for example. Presumably the problems you'd encounter would gradually decrease as the language grew more powerful. That's why I phrased the problem as a challenge. I was curious to see what happened when you tried to solve this very simple problem using existing language/library options.


> I didn't go back and add stuff to the Arc libraries to make the answer to the challenge shorter

Yes, instead of creating a new library for the challenge you created the challenge to suit the library.


No, actually, I didn't. I chose the simplest stateful web app I could think of: take input on one page and print it back on the next. What about that problem is specific to Arc?


Not specific, of course you can do it without much trouble in language/framework. It's easy to do in Arc, and with web programming with continuations in general. You want an example that is representative of things you'd like to do in practice. This example isn't. I'm not saying you did that deliberately. You have been programming websites in this continuation style for a long time, so it's understandable that you'd choose an example that's simple with continuations if you try to choose a simple example instead of a representative example. Most web programming is (1) display a list of things (2) display a detail view for something in the list (3) provide a form to add something to the list. The code for such an example provides much more information about how good a language/framework is for real world programming.

By the way, why did you choose to use string names for the data in the input form? Why not use variables directly and make aform work more like let (and like Mathematica's manipulate):

    (form
       (name (input-string))
       (age (input-number))
       (pr "Hello, " name ". You are " age " years old."))
Where input-X writes HTML output and returns a function that extracts the value of the field from the HTTP request. Validation works well too.


> Get my module accepted into some standard library?

Yes, that is the gist of it. More specifically, the challenge is, "at this point in time, has anyone gotten the appropriate code into a standard library?"

As far as the challenge is concerned, we have to take it on faith that when the challenge was posed, it was no more than a coincidence that pg's language supported an example written in a style pg likes.


I think I'm getting this. Let me try another bit of questioning to make sure I got it.

So let's say I think CSV-file processing is important. If I show doing something useful and common with CSV files in 15-20 symbols with my language of choice would it be fair to challenge other languages to do the same?

If I understand you correctly, this all hinges around what libraries you think languages should have by default and how many symbols it takes to get something "common" done using these commonly-available pieces.

This is a little too subjective for me, although I'll easily grant that web programming is much more common than CSV-file processing.

Instead of relying on the arbitrariness of what components have been built or what various committees have approved, I would amend this to be something like "after an initial bit of programming not to exceed 3 days, how much symbology do I have to piece together to solve various problems in some sort of common domain like web question/response?" Or something like that. Because as a practical matter I'm always taking a bit to ramp up on new pieces of languages anyway and 3 days or so in this context is a nit.


Yes, that's how I understand the challenge. And I agree, it is subjective[1].

I think that the most positive way of looking at it is to declare that session storage in a web app and parsing csv files are understood problems which we don't want to get bogged down solving again. Last week I was writing a small web app to browse a 2GB or so data set, which was provided to me variously in xml and csv data files in a zip file.

If I could have called:

  import data_20091201.zip
and gotten something useful, I would be all the happier.

I can now make that call, but in terms of getting stuff done, I'm judging my programming environment on the availability unzip utilities, xml and csv parsing libraries and database tools. As far as the language itself is concerned, I want to be able to structure my code neatly without worrying about forgotten temp files if the import fails.

I see the arc challenge as a proxy for making this sort of judgment, but it does come down to: "Do the people who maintain the language and contribute to its libraries worry about solving the sorts of problems that I would like to solve? And are they successful in making my life easier?"

[1] Subjective in the sense that the problem to solve is one that you may or may not care about solving, or may prefer to solve in a way that happens to use more code to make different aspects more explicit.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: