Arc Forumnew | comments | leaders | submitlogin
2 points by rocketnia 4325 days ago | link | parent

Ah, I didn't realize you disabled indent-sensitivity inside of parens, so I thought that example's indentation might have been important.

You could be onto something with ":". What do you think of these styles? ^_^

(Sorry for the huge examples.)

  (if : !user
    (submit-login-warning url title showtext text)
      : (~and (or blank.url valid-url.url) ~blank.title)
    (submit-page user url title showtext text retry*)
      : (len> title title-limit*)
    (submit-page user url title showtext text toolong*)
      : (and blank.url blank.text)
    (let dummy 34
      (submit-page user url title showtext text bothblank*))
      : (let site sitename.url
          (or big-spamsites*.site recent-spam.site))
    (msgpage user spammage*)
      : (oversubmitting user ip 'story url)
    (msgpage user toofast*)
    (let s (create-story url process-title.title text user ip)
      (story-ban-test user s ip url)
      (when ignored.user (kill s 'ignored))
      (submit-item user s)
      (maybe-ban-ip s)
      "newest"))

  (if !user
    (submit-login-warning url title showtext text)
  :   (~and (or blank.url valid-url.url) ~blank.title)
    (submit-page user url title showtext text retry*)
  :   (len> title title-limit*)
    (submit-page user url title showtext text toolong*)
  :   (and blank.url blank.text)
    (let dummy 34
      (submit-page user url title showtext text bothblank*))
  :   (let site sitename.url
        (or big-spamsites*.site recent-spam.site))
    (msgpage user spammage*)
  :   (oversubmitting user ip 'story url)
    (msgpage user toofast*)
    (let s (create-story url process-title.title text user ip)
      (story-ban-test user s ip url)
      (when ignored.user (kill s 'ignored))
      (submit-item user s)
      (maybe-ban-ip s)
      "newest"))
When I was working on Penknife, I designed every "if" macro to insert parentheses for its else clause. Mainly I did this so I could put different kinds of conditionals like 'if and 'iflet together in what looked like a single branch, but I liked its effect on self-documentation, which is similar to the use of your ":":

  (if !user
    (submit-login-warning url title showtext text)
   if (~and (or blank.url valid-url.url) ~blank.title)
    (submit-page user url title showtext text retry*)
   if (len> title title-limit*)
    (submit-page user url title showtext text toolong*)
   if (and blank.url blank.text)
    (let dummy 34
      (submit-page user url title showtext text bothblank*))
   if (let site sitename.url
        (or big-spamsites*.site recent-spam.site))
    (msgpage user spammage*)
   if (oversubmitting user ip 'story url)
    (msgpage user toofast*)
   let s (create-story url process-title.title text user ip)
    (story-ban-test user s ip url)
    (when ignored.user (kill s 'ignored))
    (submit-item user s)
    (maybe-ban-ip s)
    "newest")
Nowadays I like the idea of implementing Arc's (a:b ...) ==> (a (b ...)) syntax in the reader, and that would make my Penknife design pattern unnecessary:

  (if !user
    (submit-login-warning url title showtext text)
  :if (~and (or blank.url valid-url.url) ~blank.title)
    (submit-page user url title showtext text retry*)
  :if (len> title title-limit*)
    (submit-page user url title showtext text toolong*)
  :if (and blank.url blank.text)
    (let dummy 34
      (submit-page user url title showtext text bothblank*))
  :if (let site sitename.url
        (or big-spamsites*.site recent-spam.site))
    (msgpage user spammage*)
  :if (oversubmitting user ip 'story url)
    (msgpage user toofast*)
  :let s (create-story url process-title.title text user ip)
    (story-ban-test user s ip url)
    (when ignored.user (kill s 'ignored))
    (submit-item user s)
    (maybe-ban-ip s)
    "newest")
This particular style really would conflict with your keyword arg syntax, and I don't expect it to work in unparenthesized expressions, but maybe you can get something out of it anyway.


1 point by akkartik 4324 days ago | link

Thanks for those examples! Yes, I didn't want to hardcode ':' for just this one cond use case I had in mind. I wanted to let people highlight the tests rather than the branches if they preferred.

One nit: I wish the first two gave branches more indent than tests; I think I'm comparing them to switch statements.

In this fragment from example 1:

    (let dummy 34
      (submit-page user url title showtext text bothblank*))
      : (let site sitename.url
          (or big-spamsites*.site recent-spam.site))
..and in this one from example 2:

    (let dummy 34
      (submit-page user url title showtext text bothblank*))
  :   (let site sitename.url
        (or big-spamsites*.site recent-spam.site))
..the colon isn't separating the cases clearly enough IMO. There's a confounding vertical alignment that distracts the eye.

The discussion on readable-discuss suggested example 2, but it would require editor support to ensure indenting a line doesn't move the ':' at the start. Autoindent settings would also interfere. But they're like #ifdef's, so there's some precedent for doing things this way. Keeping the ':' in column 1 would eliminate the need for clarifying that the colon "does affect the indentation of a line.." That might make them more intuitive.

I hadn't considered the latter two ideas; they are very compelling indeed. I'm going to think about them more.

Ah, I didn't realize you disabled indent-sensitivity inside of parens, so I thought that example's indentation might have been important."

Actually even that is irrelevant ^_^. Even before I disabled indent inside parens those examples wouldn't insert parens anywhere because the inner clauses are all fully parenthesized. Wart has never wrapped a line in parens if it already began with parens.

Basically paren insertion is extremely conservative and avoids messing with code as much as possible. Now that I've disabled it inside parens this is even more true.

-----