Hacker News new | past | comments | ask | show | jobs | submit login

Indeed, my main point is not verbosity —it's regularity. I'd rather repeat `setf` in most cases in the name of regularity. That way we spot the semantic difference between lines more easily.

You'd have to use the assignment heavily to justify implementing the `=` syntax, which is barely prettier than the regular `setf` syntax. Plus, you'd probably have to add some annotation anyway, partially defeating the point:

  (assign
    x = 10
    y = 20
    z = 30)



If you repeat setf, you may need a progn to make it one expression. And parallel assignment is off the table without temporary variables:

  (if condition
    (psetf a c b a c b)
    (psetf a b c a b c))
:)

P.S. of course I know rotatef would be better here.


I'm not much for Common Lisp, but I do think Scheme is the prettiest language in which people write ugly code. As such, while I am sympathetic to the virtues of s-expressions, this example is not going to win any hearts or minds. I don't much care for Python's performance or newer features, but your snippet screams for a comparison:

    if condition:
        a, b, c = c, a, b
        a, c, b = b, a, c
That really seems much more clear than the gymnastics my mind has to do manually pairing the assignments inside of psetf. I won't argue that it's objectively better syntax, but I still think it is.


Well...

  (define-syntax assign-group!
    (ir-macro-transformer
      (lambda (x i c)
        (let ((vars (cadr x))
              (vals (caddr x)))
          `(let ,(map (lambda (var val) '(var val)) vars vals)
             ,@(map (lambda (var) 
                      `(set! ,(i var) ,var)) vars))))))
Mind, I haven't tested this, because I don't have CHICKEN Scheme (the dialect this is written in) in front of me, and I may not have matched all the parens on the end, but it should work like this:

  (assign-group! (a b c) (c a b))

Giving you your nice assigment syntax you wanted.

That's the nice thing about Lisps: if you don't like it, you can change it.


There is in fact one error in the above macro: well, I think only one: in the map, (lambda (var val) '(var val)) should be (lambda (var val) (list var val))


That's why I mentioned rotatef:

   (rotatef a c b) ;; a <-- c <-- b
                   ;; `--->----->-'


You forgot "else:"


Funny that. In my head, I parsed it as two (odd) statements under one if statement. More like when than if.




Consider applying for YC's Spring batch! Applications are open till Feb 11.

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

Search: