Arc Forumnew | comments | leaders | submitlogin
1 point by lark 4271 days ago | link | parent

Great so far. Now... how would you redirect after submitting a form?

  ;; aformh doesn't do it
  (defop prove-it1 req
    (aformh [ (pr "peekaboo") ]
            (pr "do something1 ")
            (submit)
            "/some-fancy-url"))

  ;; Neither does arformh
  (defop prove-it2 req
    (arformh [ (pr "peekaboo") ]
            (pr "do something2 ")
            (submit)
            "/some-fancy-url"))

  (defop some-fancy-url req (pr "Yeii!"))


2 points by lark 4271 days ago | link

The documentation at http://arcfn.com/doc/srv.html reads: "The callback function f must return the redirect target."

The following works:

  (defop arf rq (arform (fn (req) "foo") (prn "Click:") (submit)))
So it is only arform that redirects, not aformh or arformh.

-----

1 point by lark 4271 days ago | link

Well, there is a syntax issue. Using square brackets to express fn fails:

  (defop arf rq (arform [ "foo" ] (prn "Click:") (submit)))

-----

1 point by akkartik 4271 days ago | link

[ ... ] expands to (fn(_) (...))

So [ "foo" ] expands to (fn(_) ("foo")), which fails because you're trying to call a string like a function.

Just use (fn() "foo").

-----

1 point by lark 4271 days ago | link

It might be better if [ "foo" ] expanded to:

  (fn(_) (do "foo"))
rather than

  (fn(_) ("foo"))

EDIT: On second thought, I doubt that's what [ "foo" ] expands to:

[ ... ] expands to (fn(_) (...))

Because you can already write aform submission code that looks like:

  (defop said req
    (aform [ (pr "You entered " (arg _ "foo"))]
      (input "foo") 
     (submit)))
If that's what [ ... ] expands to, aform wouldn't even work so far because it would be trying to call:

  (fn (_) ((pr "You entered.")))
That would be a function call to a function call: (( on the call to pr.

-----

1 point by akkartik 4270 days ago | link

I just ran the following at the repl:

  arc> ([(prn "You entered " _)] 34)
  You entered 34
  Error: "...urces/arc/ac.scm:974:33: arity mismatch;\n the expected number of arguments does not match the given number\n  expected: 1\n  given: 0"
Do you see something different? I think your defop expression is also incorrect. It just happens to have the right side-effect before it runs into the error. You probably have errors at the server -- that aren't visible on the browser.

Edit: I kept having this feeling I'd already pointed this out to you -- and I just found it :) http://arclanguage.org/item?id=16356

-----

1 point by lark 4270 days ago | link

I see the following:

  arc> ([(prn "You entered " _)] 34)
  You entered 34
  Error: "car: expects argument of type <pair>; given ()"
That's good investigation. Note the work described in this thread uses Arc 3.1, not Anarki.

Btw do you mean there's something wrong with defop, or that the example I wrote is incorrect? I had gotten that example from: http://arcfn.com/doc/srv.html

-----

3 points by rocketnia 4270 days ago | link

The examples at arcfn say [do (prn ...) ...] and [w/link (pr ...) ...]. At some point you changed one of these to [ (prn ...)] for your example.

-----

1 point by lark 4269 days ago | link

Thanks. I understand one should write:

  [do (prn "...")]
I support one shouldn't. The do should be implicit.

-----

2 points by Pauan 4269 days ago | link

The reason it does that is so that things like [+ _ 1] work. Under your suggestion, you would have to write [(+ _ 1)] which looks ugly.

Rather than using [(prn ...)] you can just use [prn ...]

---

Incidentally, using Arc/Nu, it's easy to make the square brackets behave the way you want them to:

  (mac square-brackets args
    `(fn (_) (do ,@args)))
I believe Anarki has something similar as well.

-----

1 point by akkartik 4271 days ago | link

I wasn't aware of aformh before, but yes it's not supposed to redirect. But arformh is.

-----