Lambdas in BBC BASIC
The question was recently asked: "Does BBC BASIC have lambdas?" (i.e. anonymous functions). The 'official' answer is no, in the sense that the language itself does not incorporate that concept, but as is so often the case the functionality can quite easily be synthesised from lower-level operations.
Here is an example (it relies on extensions available in BBC BASIC for Windows, BBC BASIC for SDL 2.0 and the Console Mode editions):
Here we create two lambdas, foo (which is function-like) and bar (which is procedure-like); these are captured as opaque structures, because that's the data type most suited to holding a lambda. They are then executed using the normal syntax for an indirect function or procedure call.
If the lambda doesn't take any parameters, simply omit the initial parenthesised list. As shown this code can only accept single-line lambdas, but it would be possible to extend it to multi-line functions using a suitable syntax to indicate the line delimiter.
Here is an example (it relies on extensions available in BBC BASIC for Windows, BBC BASIC for SDL 2.0 and the Console Mode editions):
PROC_lambda(foo{}, "(x) = x * x") PROC_lambda(bar{}, "(x) PRINT x ^ 2 : ENDPROC") PRINT FN(foo{})(5) PROC(bar{})(PI) END DEF PROC_lambda(RETURN a{}, a$) LOCAL a%% : DIM a{a%%, a$} IF INKEY(-256) <> &57 IF @platform% AND &40 a%% = ]332 ELSE a%% = !332 IF EVAL("1RECTANGLE:" + a$) a$ = $(a%% + 3) a.a$ = a$ + CHR$&D : a.a%% = PTR(a.a$) ENDPROC
Here we create two lambdas, foo (which is function-like) and bar (which is procedure-like); these are captured as opaque structures, because that's the data type most suited to holding a lambda. They are then executed using the normal syntax for an indirect function or procedure call.
If the lambda doesn't take any parameters, simply omit the initial parenthesised list. As shown this code can only accept single-line lambdas, but it would be possible to extend it to multi-line functions using a suitable syntax to indicate the line delimiter.
0