Cutting
I did some long overdue Chicken hackery yesterday, and by accident I found out that Chicken's (or rather, SRFI-26's) cut/cute macros are not the same as Arc's [ ] syntax after all.
Scheme/Arc aficionados already knew this, of course, but to me it was news since I've never really used cut much. Here's a short explanation.
Scheme's cut produces an anonymous function that takes as many arguments as there are <> symbols at the "top level". E.g.
> (cut + 1 <>) #<procedure (? g3)> ; has one argument > (cut + 1 <> <>) #<procedure (? g4 g5)> ; has two arguments ; etc...
However, any <> that is found in a nested expression, is not considered as a parameter. Therefore:
;this works... > (map (cut + 1 <>) '(1 2 3)) (2 3 4) ; but this does not: > (map (cut + 1 (* 2 <>)) '(1 2 3)) Error: bad argument count - received 1 but expected 0: #<procedure (?)>
By contrast, Arc's [ ] syntax produces an anonymous function that expects one and only one argument, which is represented by a single underscore. As a result, it's simultaneously more and less limited than cut:
arc> (map [+ 1 _] '(1 2 3)) (2 3 4) arc> (map [+ 1 (* 2 _)] '(1 2 3)) (3 5 7) ; no problem ; but two parameters doesn't work: arc> (map [cons _ _] '(1 2 3) '(4 5 6)) Error: "#<procedure>: expects 1 argument, given 2: 1 4"
Of course, for anonymous functions that are more complex than this, it's probably better to just use lambda... :-/ Or a named function.
website design said,
July 10, 2008 @ 4:39 am
> As a result, it's simultaneously more and less limited than cut I love this type of sentences. They simultaneously help and prevent understanding.
PJW said,
July 10, 2008 @ 1:00 pm
I do not see a reason why cut can not be implemented in a fashion that allows for:
> (map (cut + 1 (* 2 )) '(1 2 3))
It is just writing syntax-rules macros that need nested recursion is a pain, at least in my opinion. At least if it is not possible it is not obvious to me the reason why it would be so.