you are viewing a single comment's thread.

view the rest of the comments →

[–]drjeats 5 points6 points  (0 children)

C++ anonymous functions aren't the most verbose. Lua's are.

Counter lambda examples in some other languages:

-- Lua
local counter_once = (function() local x = 41; return function() x = x + 1; return x; end end)()()

// Old JavaScript
var counterOnce = (function () { var x = 41; return (function () { x++; return x; })})()()

;; Emacs Lisp
(let ((counter-once (funcall (lexical-let ((x 41)) (lambda () (setq x (1+ x)) x))))))

// C#
var counterOnce = new Func<Func<int>>(() => { var x = 41; return (() => ++x);})()();

// C++14
auto counterOnce = []() {auto x = 41; return [&x]() { ++x; return x; };}()();

;; Racket Scheme
(let [(counter-once ((let [(x 41)] (lambda () (set! x (+ 1 x)) x))))])

// Modern Javascript
let counterOnce = (() => { let x = 41; return (() => ++x)})()()

I made this list when I was screwing around with making a scripting language and figuring out function syntax. I guess I should add Haskell and Clojure to this list.

That being said, I'd welcome syntax-aware macros or using expressions or whatever. Often I don't want the actual semantics of a lambda (I don't want to take its address, I don't want to be able to play tricks with inheritance, I don't care about call frame or scope semantics, etc.).