3726

53
+54  Q:

## How do you create a function that returns a function in your language of choice?

Recently I've been learning Lua and I love how easy it is to write a function that returns a function. I know it's fairly easy in Perl as well, but I don't think I can do it in C without some heartache. How do you write a function generator in your favorite language?

So that it's easier to compare one language to another, please write a function that generates a quadratic formula:

``````f(x) = ax^2 + bx + c
``````

Your function should take three values (`a`, `b`, and `c`) and returns `f`. To test the function, show how to generate the quadratic formula:

``````f(x) = x^2 - 79x + 1601
``````

Then show how to calculate `f(42)`. I'll post my Lua result as an answer for an example.

Some additional requirements that came up:

1. All of `a`, `b`, `c`, `x`, and `f(x)` should be floating point numbers.

2. The function generator should be reentrant. That means it should be possible to generate:

``````g(x) = x^2 + x + 41
``````

And then use both `f(x)` and `g(x)` in the same scope.

Most of the answers already meet those requirements. If you see an answer that doesn't, feel free to either fix it or note the problem in a comment.

+9  A:

## Lua

``````function quadratic (a, b, c)
return function (x)
return a*(x*x) + b*x + c
end
end

local f = quadratic (1, -79, 1601)

print (f(42))
``````

The result:

47

Several other answers have further generalized the problem to cover all polynomials. Lua handles this case as well:

``````function polynomial (...)
local constants = {...}

return function (x)
local result = 0
for i,v in ipairs(constants) do
result = result + v*math.pow(x, #constants-i)
end
return result
end
end
``````
I like this. Could you suggest a really good Lua introduction? If there are any specific for someone coming from Perl and C, that'd be great, but any good Lua intro that assumes a decent level of experience programming would work.
Programming in Lua (http://www.lua.org/pil/index.html) is really good. I have a similar background and Lua has been an easy language to add. Maybe this is worth asking as a regular SO question.
www.lua.org has pointers to a lot of background, papers, documentation, a mailing list, a user-maintained wiki, and a lua-related project host. PiL is a good book, the new Lua Programming Gems is also worth the read, and the reference manual is among the best of the breed that I've read.
+38  A:

``````quadratic a b c = \x -> a*x*x + b*x + c
``````

or, I think more neatly:

``````quadratic a b c x = a*x*x + b*x + c
``````

(if you call it with only three parameters, you get back a function ready for the fourth)

To use:

``````let f = quadratic 1 -79 1601 in f 42
``````

### Edit

Generalizing it to arbitrary-order polynomials (as the OCaml answer does) is even nicer in Haskell:

``````polynomial coeff = sum . zipWith (*) coeff . flip iterate 1 . (*)
f = polynomial [1601, -79, 1]
main = print \$ f 42
``````

### Perverse

Treating functions as if they were numbers:

``````{-# LANGUAGE FlexibleInstances #-}
instance Eq (a -> a) where (==) = const . const False
instance Show (a -> a) where show = const "->"
instance (Num a) => Num (a -> a) where
(f + g) x = f x + g x; (f * g) x = f x * g x
negate f = negate . f; abs f = abs . f; signum f = signum . f
fromInteger = const . fromInteger
instance (Fractional a) => Fractional (a -> a) where
(f / g) x = f x / g x
fromRational = const . fromRational

quadratic a b c = a*x^2 + b*x + c
where x = id :: (Fractional t) => t -> t
f = quadratic 1 (-79) 1601
main = print \$ f 42
``````

...although if `1 (-79) 1601` weren't numeric literals, this would require some additional application of `const`.

This makes me want to learn Haskell...
I started learning Haskell. Then I decided to try reading a file, learned about monads, and my brain fried. It's been a few years, however. Maybe I'm ready to try again.
I think more people would continue to learn Haskell if "monad" were renamed to something more familiar, like "bunny" -- the subset of its flexibility that you need to get started should not intimidate any programmer.
We could call it the "symbol of functional excitement", which of course looks like a bunny. (in joke)
"Bunny" would be worse! The thing that would have gotten me over monads would have been if there were a dead simple way to read lines from files like the <> operator in Perl.
Umm, like http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v%3Ainteract ? Granted, that doesn't do argument parsing, but that's only another two lines of code.
First I've heard of it. And I'm not the only one: http://cod3po37ry.blogspot.com/2007/02/more-on-haskell-io-and-interact.html . It's the top Google result for "interact Haskell". Later, however, there's http://www.cse.unsw.edu.au/~dons/data/Basics.html . That might pull me into Haskell. ;-)
I can't decide if the last part is genius or insanity.
+9  A:

## perl

``````sub quadratic {
my (\$a, \$b, \$c) = @_;
return sub {
my (\$x) = @_;
return \$a*(\$x*\$x) + \$b*\$x + \$c;
}
}

my \$f = quadratic (1, -79, 1601);

print \$f->(42);
``````
Your code is the code I'd write, but ugly eval code is faster and more general. I use local \$i to avoid a capture.sub polynomial { local \$i = @_ - 1; eval 'sub { my (\$x) = @_; ' . join("+", map { \$_.('*\$x'x\$i--) } @_) . ' }';}my \$f = polynomial(1, -79, 1601);print \$f->(42);
+46  A:

## JavaScript

``````function quadratic(a, b, c)
{
return function(x)
{
return a*(x*x) + b*x +c;
}
}

var f = quadratic(1, -79, 1601);
``````
Javascript gets a bad rap sometimes, but it's shocking how straightforward this implementation is.
Until jQuery existed, I hated javascript. But since I started looking a jQuery, things got different, I learned about the javascript module pattern. It really helps keeping things clean. The way to work with javascript evolved in the last years, and it is now a really great language.
I'm with Beska. +1 for the simplicity of the syntax.
@Martin, I had the same experience. I used to think of it as a necessary evil to script HTML pages, but now I really enjoy it, and even play with it outside web browsers.
Javascript as a language is beautiful; it's the cross-browser / speed issues that cause the suckage.
@John - that's kind of five years ago, the speed is almost never a factor now and the cross-browser pain is very easy to abstract away.
+12  A:

## Ruby

``````def foo (a,b,c)
lambda {|x| a*x**2 + b*x + c}
end

bar = foo(1, -79, 1601)

puts bar[42]
``````

gives

``````47
``````
Woah! Why do Ruby's lambda expressions use [brackets] when the functions use (parenthesis)? That's weird as hell. My knee-jerk reaction rejects this evil language.
Actually I like Ruby but yeah, that is kind of nasty. You can also do bar.call() though.
I kind of like bar.call(), actually. It's nice and explicit, and it clearly says "Hey, this isn't a function but we're calling it as one!" At least, as far as I can tell.
Methods and variables are in different namespaces. It would be ambiguous whether you wanted to call the method bar or the lambda that's the value of the variable bar. Proc#call is the "real" method for calling a lambda, but since lambdas are objects and Ruby is TIMTOWTDI, the [] method is an alias.
+4  A:

## MATLAB

Using an anonymous function

``````function f=quadratic(a,b,c)
% FUNCTION quadratic. returns an inline polynomial with coefficients a,b,c
f = @(x)a*x^2+b*x+c;
``````

or using inline which is not as clean/concise

``````function f=quadratic2(a,b,c)
% FUNCTION quadratic. returns an inline polynomial with coefficients a,b,c
f = inline(['(',num2str(a),'*x^2)+(',num2str(b),'*x)+(',num2str(c),')'],'x');
``````

Usage

``````>> ff = quadratic(1,-79,1601);
>> ff(42)
ans =
47
``````
I definitely like the first one better. The second one looks too EVAL-y. =)
+9  A:

## PHP

``````function quadratic(\$a, \$b, \$c) {
return create_function('\$x',
'return ' . \$a . ' * (\$x * \$x) + ' . \$b . ' * \$x + ' . \$c . ';'
);
}

echo \$f(42) . "\n";
``````

The result:

47

Which reminds me how much I LOATH javascript's create_function!
Also: for the love of \$deity, please do not interpret my having answered this as meaning that PHP is my personal language of choice.
I interpreted your answer to mean that you chose to answer the question in PHP. ;-) But I do see your top tag is: "php ×37". Must mean you like helping the lost and suffering!
Lost and suffering? There is a subset of PHP 5.2+ that is a fantastic language.
The PHP 5.3 answer looked pretty good! I'll try to keep my PHP bashing to a minimum from now on. ;-)
@Jon Ericson: That, or that I get paid nicely to write it irrespective of my feelings about it (and, on SO, answer what I know). Don't tell anyone, but my dislike for PHP is pretty friendly; it's nothing like my violent loathing for, say, Visual Basic.
+4  A:

## JavaScript

``````function quadratic(a,b,c) {
return function(x) {
return a*(x*x) + b*x + c;
}
}

var f = quadratic (1, -79, 1601);

f(42);
``````
so simple... I love JS.
+29  A:

## Python

``````def quadratic(a, b, c):
return lambda x: a*x**2 + b*x + c

# Outputs 47
``````

Without using lambda (functions can be passed around in Python like any variable, class etc):

``````def quadratic(a, b, c):
def returned_function(x):
return a*x**2 + b*x + c
return returned_function
# Outputs 47
``````

Equivalent using a class rather than returning a function:

``````class quadratic:
def __init__(self, a, b, c):
self.a, self.b, self.c = a, b, c
def __call__(self, x):
return self.a*x**2 + self.b*x + self.c

# Outputs 47
``````
I've added an example not using lambdas, and not using a returned-function at all - returning functions isn't very Python'y, I would say.. Lambda in this specific case is probably right, however
I would say that returning a function here is *more* Pythonic, since the object returned from quadratic() (in either version) is only meant to be called. The class version is like creating an iterable class when all you need is a generator function—overkill, without any real benefit.
Returning a function in python is probably more common than you realise, especially when you throw python's decorators into the mix.
Just for completeness, `quadratic = lambda a, b, c: lambda x: a*x**2 + b*x + c` also works. Wouldn't recommend it though.
+7  A:

## C (sorta)

clang (LLVM's C compiler) has support for what they call blocks (closures in C):

``````double (^quadratic(double a, double b, double c))(double) {
return _Block_copy(^double(double x) {return a*x*x + b*x + c;});
}

int main() {
double (^f)(double);
printf("%g\n", (^f)(42));
_Block_release(f);
return 0;
}
``````

At least, that's how it should work. I haven't tried it out myself.

Wouldn't it be better to just use a function pointer?
No, you can't store the extra information (values for a,b,c) in a function pointer.
True. I started trying to do it with a function pointer, and then realized this. I think it can be done, but it would have to be very complicated, methinks...
See my other answer, http://stackoverflow.com/questions/644246/644356#644356 for normal C + FFCALL library (which uses some assembly tricks).
+11  A:

## C++

``````#include <iostream>

{
int a_,b_,c_;
public:
Quadratic(int a, int b, int c)
{
a_ = a;
b_ = b;
c_ = c;
}
int operator()(int x)
{
return a_*x*x + b_*x + c_;
}
}

int main()
{
std::cout << f(42);
return 0;
}
``````
Surely is should #include <functional>, right :-)
Isn't this passing around an object, rather than a function? If that's all that is required, the implementation in most any OO language is trivial.
@ted: In a way. Yes, it's strictly speaking an object, but it acts pretty much as a function. It defines the () operator so it can be called as a function, and especially in templated code, treated completely as a function. It's the best you're going to get in c++. :)
@ted: Technically, langugaes with true function types tend to define functions as objects with special properties. Here, operator overloading puts up a bit of a façade, but it's not an elegant solution.
Very cool. I'd assumed the C++ solution would have employed templates, but this is pretty clever. I never would have thought to overload ()!
@Jon: It's a very common technique, and used a lot in the standard library. An object that overloads operator() is called a functor. Very useful if you want to use some custom comparer while sorting with std::sort, for example
The key to how this works is that you can overload operator() in C++, which most common OO languages don't allow. They generally can't return something to be called as a function, at least not in this way.
I've posted a boost::lambda-using C++ version in another answer. Enjoy.
The big benefit of functors is that you can create template functions that accept both function pointers and functors.
+16  A:
Just wondering, what do you do when you want to return an argument with more than one parameter? % %2 %3?
Right. % is an alias for %1. The highest %N that you use determines how many arguments the fn takes. You can also use the longer (fn [x] ...) form of course, #() is just a shortcut.
+9  A:

## C#

``````public Func<double, double> F(double a, double b, double c){
Func<double, double> ret = x => a * x * x + b * x + c;

return ret;
}

public void F2(){
var f1 = F(1, -79, 1601);

Console.WriteLine(f1(42));
}
``````
F could just return the lambda directly, instead of using that intermediate ret variable.
yeah you right, just accostumed to do this for debugging purposes
+23  A:

## C# using only Lambdas

``````Func<double, double, double, Func<double, double>> curry =
(a, b, c) => (x) => (a * (x * x) + b * x + c);
Func<double, double> quad = curry(1, -79, 1601);
``````
+16  A:

## Scheme

``````(define (quadratic a b c)
(lambda (x)
(+ (* a x x) (* b x) c)) )

(display ((quadratic 1 -79 1601) 42))
``````
+14  A:

# F#

Here's a nice one line example in F#:

``````let quadratic a b c x = a*x*x + b*x + c
let f = quadratic 1 -79 1601 // Use function currying.

printfn "%i" (f 42)
``````

And for arbitrary-order:

``````let polynomial coeffs x =
coeffs |> List.mapi (fun i c -> c * (pown x i)) |> List.sum
let f = polynomial [1601; -79; 1]
f 42
``````

And to generalize over numerics:

``````let inline polynomial coeffs x =
coeffs |> List.rev |> List.mapi (fun i c -> c * (pown x i)) |> List.sum

> let f = polynomial [1601.; -79.; 1.];;
val f : (float -> float)

> let g = polynomial [1601m; -79m; 1m];;
val g : (decimal -> decimal)
``````
@MichaelGG: Good addition. I was going to write the same but you beat me to it.
+14  A:

# Java

(untested)

First, we need a Function interface:

``````public interface Function {
public double f(double x);
}
``````

And a method somewhere to create our quadratic function. Here we're returning an anonymous implementation of our Function interface. This is how Java does "closures". Yeah, it's ugly. Our parameters need to be final for this to compile (which is good).

``````public Function quadratic(final double a, final double b, final double c) {
return new Function() {
public double f(double x) {
return a*x*x + b*x + c;
}
};
}
``````

From here on out, it's reasonably clean. We get our quadratic function:

``````Function ourQuadratic = quadratic(1, -79, 1601);
``````

and use it to get our answer:

``````double answer = ourQuadratic.f(42);
``````
+7  A:

## Python

In Python using only lambdas:

``````curry = lambda a, b, c: lambda x: a*x**2 + b*x + c
``````
+7  A:

# C

With the FFCALL library installed,

``````#include <trampoline.h>

double a;
double b;
double c;

double a, b, c;
return a*x*x + b*x + c;
}

double (*quadratic(double a, double b, double c))(double) {
args = malloc(sizeof(*args));
args->a = a;
args->b = b;
args->c = c;
}

int main() {
double (*f)(double);
printf("%g\n", f(42));
free(trampoline_data(f));
free_trampoline(f);
return 0;
}
``````
Care to explain the semantics ? Is quadratic a function ? A function-pointer ? A function whose return type is a pointer to something ?
`f` is a function pointer to some code that was dynamically allocated and generated by FFCALL.
Oh, I didn't answer completely, huh? If you're unfamiliar with the unwinding "declaration follows usage" pattern of C, it can be confusing, but `quadratic` is a function which returns a function pointer.
+12  A:

## Common Lisp

```(defun make-quad (a b c)
#'(lambda (x) (+ (* a x x) (* b x) c)))

(funcall (make-quad 1 -78 1601) 42)
```
I think that formatting is not necessary, the specification said to calculate, not to display. You can see the result on the REPL, anyway.
+14  A:

## Java

You don't.

And here's why:

``````// OneArgFunction.java
// Generic interface for reusability!
public interface OneArgFunction<P,R> {
public R evaluate(P param);
}
public OneArgFunction<Double, Double> quadratic(final double a, final double b, final double c) {
return new OneArgFunction<Double, Double>() {
public Double evaluate(Double param) {
return param*param*a + param*b + c;
}
};
}
// And...
``````
@Brian: As I said... ;)
param*a*a? Surely you mean param*param*a? And yeah, the generics make this even uglier than mine.
@Adam: Yes, I'll fix that now. (Funny thing is that I had it right at first, but then I thought it didn't look right so I changed it.)
This is painful.
@andy: Because of the explanation, you mean?
For all the griping about this, it does show the way to something better. Just a little syntactic sugar would allow a lambda-like expression to implement a one-method interface. A bit of type inference and it would be fine. Okay, the names closed over must be `final`, but Haskell wears that same limitation with pride!
+8  A:

## Prolog

``````test :-
writeln(Result).

create_quadratic([A, B, C], f(X, A * X**2 + B * X + C)).

evaluate(f(X, Expression), X, Result) :-
Result is Expression.
``````

Testing:

``````?- test.
47
true.
``````
+8  A:

## Scala

``````def makeQuadratic(a: Int, b: Int, c: Int) = (x: Int) => a * x * x + b * x + c
val f = makeQuadratic(1, -79, 1601)
println(f(42))
``````

Edit: Apparently, the above solution uses integer values instead of floating point values. To comply with the new requirements, makeQuadratic must be changed to:

``````def makeQuadratic(a: Float, b: Float, c: Float) =
(x: Float) => a * x * x + b * x + c
``````
+21  A:

## PHP 5.3

``````function quadratic(\$a, \$b, \$c)
{
return function(\$x) use(\$a, \$b, \$c)
{
return \$a*(\$x*\$x) + \$b*\$x + \$c;
};
}

echo \$f(42);
``````
+1 for PHP owning Java.
+5  A:

# Standard ML

Using functional languages is just way too easy.

``````fun quadratic (a, b, c) = fn x => a*x*x + b*x + c : real;
val f = quadratic (1.0, ~79.0, 1601.0);
f 42.0;
``````
It can be done simpler though. fun quadratic (a, b, c) x = a*x*x + b*x + c;:)
A:

## C (take four, pure ANSI C)

### warning, this fails the new "re-entrant" criterion

Not perfect, but...

``````/* file "quad.c" */

static double _a, _b, _c;

typedef double(*fnptr)(double);

{
return _a * x * x + _b * x + _c;
}

fnptr quadratic(double a, double b, double c)
{
_a = a;
_b = b;
_c = c;
}

typedef double(*fnptr)(double);
extern fnptr quadratic(double a, double b, double c);

/* file "main.c" */

#include <stdio.h>

int main(void)
{
fnptr f = quadratic(1, -79, 1601);
printf("%lf\n", f(42));
return 0;
}
``````
I'd make a, b, c, and x doubles as well. Also, it probably won't support generating a second, distinct quadratic formula. But thank you for the suggestion. It seems to confirm my guess about C.
Yeah, they should all be doubles, but oh well. I figured the return value was the very likely to be crazy, compared to input values which were only slightly likely to be crazy. I think there's a way to do it in C with lots of mad-crazy malloc()ing, but I can't think of it. I need sleep.
My guess at a C solution would have been to use the pre-compiler somehow. It's interesting to see how others approach a problem. Get some sleep. ;-)
+9  A:

## Ocaml

``````let quadratic a b c = fun x -> a*x*x + b*x + c
``````

but really, thanks to currying, the following is equivalent:

``````let quadratic a b c x = a*x*x + b*x + c
``````

For compilation reasons, the first is actually better because the compiler wont need to call caml_applyX and caml_curryX. Read more here

How about general polynomials (with floats)?

``````let polynomial coeff =
(fun x ->
snd (List.fold_right
(fun co (i,sum) ->
((i+.1.0), sum +. co *. (x ** i))) coeff (0.0,0.0))
)
``````
+4  A:

## Standard ML

``````fun quadratic (a, b, c) x = a*x*x + b*x + c : real;
val f = quadratic (1.0, ~79.0, 1601.0);
f 42.0;
``````

or

``````fun quadratic a b c x = a*x*x + b*x + c : real;
val f = quadratic 1.0 ~79.0 1601.0;
f 42.0;
``````

(but I think the first version more closely matches what was requested)

+2  A:

## Perl

Alternate version:

``````sub fn {
my ( \$aa, \$bb, \$cc ) = @_;
sub { \$x = shift; \$x = \$x ** 2 * \$aa + \$x * \$bb + \$cc }
}

print fn( 1, -79, 1601 )->( 42 );
``````

One could also actually store the generated function:

``````\$f = fn( 1, -79, 1601 );
print \$f->( 42 );
``````
+20  A:

## C++

I don't see one using boost::lambda yet...

``````#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <iostream>

using namespace std;
using namespace boost;
using namespace boost::lambda;

function<float(float)> g(float a,float b,float c)
{
return a*_1*_1 + b*_1 + c;
}

int main(int,char**)
{
const function<float(float)> f=g(1.0,-79.0,1601.0);

cout << f(42.0) << endl;

return 0;
}
``````

(works with whichever gcc and boost are current on Debian/Lenny).

+1 for boost's insane syntax!
It's not boost's fault that C++'s syntax can look like that ;)
First time I'd actually tried out boost::lambda. Quite pleased with how clean it is. What it must be doing with operator overloading behind the scenes doesn't bear thinking about though!
boost::lambda challenges me and fills me with a pleasant kind of fear.
Beautiful! I should definitely look into this Boost stuff as soon as I start writing something in C++ again.
If you like this check out the C++0x version someone posted (and my boost::mpl version)
+7  A:

# Perl 6

``````sub quadratic(\$a, \$b, \$c) { -> \$x { \$a*\$x*\$x + \$b*\$x + \$c } }
my &f := quadratic(1, -79, 1601);
say f(42);
``````
+11  A:

## C++0x

I don't actually have a compiler that supports this, so it could be (probably is) wrong.

``````auto quadratic = [](double a, double b, double c) {
return [=] (double x) { return a*x*x + b*x + c; };
};

auto f = quadratic(1, -79, 1601);
std::cout << f(42) << std::endl;
``````
I want! Anyone got any idea who's compiler will be the first with lambda support ?
Apparently, the Visual Studio 2010 CTP supports them, but you have to run it in Virtual PC. GCC has support for a few c++0x features, but not lambdas yet. There's a separate branch for it, but I've never used it.
There are (obviously) a few bugs in VS2k10's lambda implementation (it's only a CTP, not a final version), but yeah, it's one of the few C+0x features they're planning to support in the next release. For full C++0x support, we'll have to wait a few more years.
+12  A:

x86_32 Assembly (I am very new to it, it may not be the best way to do it, comments welcome):

``````#define ENTER_FN \
pushl %ebp; \
movl %esp, %ebp
#define EXIT_FN \
movl %ebp, %esp; \
popl %ebp; \
ret
.global main

calculate_fabcx: #c b a x
ENTER_FN

# %eax= a*x*x
movl 20(%ebp), %eax
imull %eax, %eax
imull 16(%ebp), %eax

# %ebx=b*x
movl 12(%ebp), %ebx
imull 20(%ebp), %ebx

# %eax = f(x)

EXIT_FN

calculate_f: #x
ENTER_FN

pushl 8(%ebp) # push x
movl \$0xFFFFFFFF, %eax # replace by a
pushl %eax
movl \$0xEEEEEEEE, %eax # replace by b
pushl %eax
movl \$0xDDDDDDDD, %eax # replace by c
pushl %eax

movl \$calculate_fabcx, %eax
call *%eax
popl %ecx
popl %ecx
popl %ecx
popl %ecx

EXIT_FN
.set calculate_f_len, . - calculate_f

generate_f: #a b c
ENTER_FN

#allocate memory
pushl \$calculate_f_len
call malloc
popl %ecx

pushl \$calculate_f_len
pushl \$calculate_f
pushl %eax
call copy_bytes
popl %eax
popl %ecx
popl %ecx

movl %eax, %ecx

movl 8(%ebp), %edx
movl %edx, (%ecx)

movl 12(%ebp), %edx
movl %edx, (%ecx)

movl 16(%ebp), %edx
movl %edx, (%ecx)

EXIT_FN

format:
.ascii "%d\n\0"

main:
ENTER_FN

pushl \$1601
pushl \$-79
pushl \$1
call generate_f
popl %ecx
popl %ecx
popl %ecx

pushl \$42
call *%eax
popl %ecx

pushl %eax
pushl \$format
call printf
popl %ecx
popl %ecx

movl \$0, %eax
EXIT_FN

copy_bytes: #dest source length
ENTER_FN

subl \$24, %esp

movl 8(%ebp), %ecx # dest
movl %ecx, -4(%ebp)

movl 12(%ebp), %ebx # source
movl %ebx, -8(%ebp)

movl 16(%ebp), %eax # length
movl %eax, -12(%ebp)

addl %eax, %ecx # last dest-byte
movl %ecx, -16(%ebp)

addl %eax, %edx # last source-byte
movl %ecx, -20(%ebp)

movl -4(%ebp), %eax
movl -8(%ebp), %ebx
movl -16(%ebp), %ecx

copy_bytes_2:
movb (%ebx), %dl
movb %dl, (%eax)
incl %eax
incl %ebx
cmp %eax, %ecx
jne copy_bytes_2

EXIT_FN
``````

By coincidence, this thread fits perfectly to whan I am doing at the moment, namely, collecting implementations of Church Numerals in several languages (which is a similar problem, but slightly more complicated). I have already posted some (javascript, java, c++, haskell, etc.) on my Blog, for example here and in older posts, just if somebody is interested in this (or has an additional implementation for me ^^).

Trouble if the heap is execute-protected (i.e. W^X or similar technologies) -- you really should mmap a new page and mprotect to make it executable. Otherwise, it's written just fine -- clear and easy to read.
Currying in assembly? Sweet.
+7  A:

Smalltalk

A simple solution using a code block:

```| quadratic f |
quadratic := [:a :b :c | [:x | (a * x squared) + (b * x) + c]].
```

And to generate the function and call it:

```f := quadratic value: 1 value: -79 value: 1601.
f value: 42.
```
+4  A:

## MATLAB (part deux)

This is a variant of what Azim posted, which will allow you to create functions that do computations which are too complex to encompass in an anonymous function:

``````function f = quadratic(a,b,c)
f = @nested_fcn;
function value = nested_fcn(x)
value = a*x^2+b*x+c;
end
end
``````

Usage:

``````fcn = quadratic(1,-79,1601);
fcn(42)
``````
nice. I never realized you could nest functions like that. When you do nest functions in this way, do variables such as (a,b,c) have "global" scope within the function? I noticed you didn't have to pass them as arguments to nested_fcn?
In this example, the variables (a,b,c) are stored in the workspace of quadratic, but can be accessed by nested_fcn. However, variables x and value are not declared in quadratic, so they only exist in nested_fcn. For more info: www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f4-39683.html
Thanks for the explanation and link.
+2  A:

# Tcl

``````proc quadratic { a b c } {
proc \$name {x} "return \[expr (\$a)*(\\$x)*(\\$x)+(\$b)*(\\$x)+(\$c)\]"
return \$name
}
``````

Usage:

``````set f [quadratic 1 -79 1601]
\$f 123
``````

Notes:

• Tcl doesn't have first class functions. Commands must be named and called by name. Fortunately that name can be stored in a variable.
• the expr command chokes on spaces. No, thats not a regex, just a regular infix expression.
• proc command bodies are usually wrapped in `{}`'s, but to get variable substitution to work correctly, without going to a lot of trouble elsewhere, It's set here using `"`'s and abundant `\`'s

RHSeeger suggests a way to make the function construction a little easier, using `[string map]`:

``````proc quadratic { a b c } {
proc \$name {x} [string map [list %A \$a %B \$b %C \$c] {
return [expr {(%A * \$x * \$x) + (%B * \$x) + %C}]
}]
return \$name
}
``````

Of course this can be used in the very same way. Tcl8.5 also has a way to apply a function to arguments without creating a named proc, by using the `[apply]` command. It looks similar, again using the `[string map]` method.

``````proc quadratic_lambda { a b c } {
return [list {x} [string map [list %A \$a %B \$b %C \$c] {
return [expr {(%A * \$x * \$x) + (%B * \$x) + %C}]
}]]
}

set f [quadratic_lambda 1 -79 1601]
apply \$f 123
``````

I've given this version a different name to emphasize that it works a little differently. Notice that it returns a list that looks similar to the arguments to a proc. Using `[apply]` on this value is exactly equivalent to invoking a proc with args and body matching the first argument of the apply command with the rest of the apply command. The upside of this is that you don't polute any namespaces for one-off type procs. the downside is that it makes it just a little more tricky to use a proc that actually does exist.

I tend to use [string map] for cases like this.proc quadratic { a b c } { set name "quadratic_\${a}_\${b}_\${c}" proc \$name {x} [string map [list %A \$a %B \$b %C \$c] { return [expr {(%A * \$x * \$x) + (%B * \$x) + %C}] }] return \$name}
Bah, sorry, can't format my comment. There are newlines and spaces in there.
+4  A:

## PowerShell

PowerShell has a notion of ScriptBlock, which is like an anonymous method;

``````\$quadratic = { process { \$args[0]*(\$_*\$_) + \$args[1]*\$_ + \$args[2]; } }
42 | &\$quadratic 1 (-79) 1601
47
``````
+3  A:

## Visual Basic .NET using Only Lambdas

This is possible in Visual Basic .NET too.

``````Dim quadratic = Function (a As Double,b As Double,c As Double) _
Function(x As Double) (a * x * x) + (b * x) + c

Dim f = quadratic(1.0, -79.0, 1601.0)

f(42.0)
``````
+1  A:

ActionScript 2

``````function quadratic(a:Number, b:Number, c:Number):Function {

function r(x) {
var ret = a*(x*x)+b*x+c;
return ret;
}
return r;
}

var f = quadratic(1, -79, 1601);
trace(f(42));
``````
+1  A:

## Java

Here's a generalized version using Functional Java. First import these:

``````import fj.F;
import fj.pre.Monoid;
import fj.data.Stream;
import static fj.data.Stream.iterate;
import static fj.data.Stream.zipWith;
import static fj.Function.compose;
``````

And here's a generalized polynomials module:

``````public class Polynomials<A> {
private final Monoid<A> sum;
private final Monoid<A> mul;

private static <A> F<F<A, A>, Stream<A>> iterate(final A a) {
return new F<F<A, A>, Stream<A>>() {
public Stream<A> f(final F<A, A> f) {
return iterate(f, a);
}
}
}

private static <A> F<Stream<A>, A> zipWith(final F<A, F<A, A>> f,
final Stream<A> xs) {
return new F<Stream<A>, A>() {
public A f(final Stream<A> ys) {
return xs.zipWith(f, ys);
}
}
}

public Polynomials(final Monoid<A> sum, final Monoid<A> mul) {
this.sum = sum;
this.mul = mul;
}

public F<A, A> polynomial(final Stream<A> coeff) {
return new F<A, A>() {
public A f(final A x) {
return compose(sum.sumLeft(),
compose(zipWith(mul.sum(), coeff),
compose(iterate(1), mul)));
}
}
}
}
``````

Example usage with integers:

``````import static fj.pre.Monoid.intAdditionMonoid;
import static fj.pre.Monoid.intMultiplicationMonoid;
import static fj.data.List.list;
...

intMultiplicationMonoid);
F<Integer, Integer> f = p.polynomial(list(1601, -79, 1).toStream());
System.out.println(f.f(42));
``````
+1  A:
``````var quadratic = func(a,b,c) {
func(x) {a* (x*x) +b*x +c} # implicitly returned to caller
}

print(result~"\n");
``````
+5  A:

## C++ metaprogramming

For sheer perversity, using boost::mpl to do it all at compile time...

(Floats aren't allowed as template arguments, so this is integers only.)

``````#include <boost/mpl/arithmetic.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/comparison.hpp>
#include <boost/mpl/equal_to.hpp>
#include <boost/mpl/lambda.hpp>
#include <iostream>
using namespace boost::mpl;

// g returns a quadratic function f(x)=a*x^2+b*x+c
template <typename a,typename b,typename c> struct g
:lambda<
plus<
multiplies<a,multiplies<_1,_1> >,
plus<multiplies<b,_1>,c>
>
>{};

// f is the quadratic function with the coefficients specified
typedef g<int_<1>,int_<-79>,int_<1601> >::type f;

// Compute the required result
typedef f::apply<int_<42> >::type result;

// Check the result is as expected
// Change the int_<47> here and you'll get a compiler (not runtime!) error
struct check47 {
BOOST_MPL_ASSERT((equal_to<result,int_<47> >));
};

// Well if you really must see the result...
int main(int,char**) {
std::cout << result::value << std::endl;
}
``````

(Works on Debian/Lenny's gcc+boost)

I'm not sure whether there's some way of getting the compiler to log out that the result is `int_<47>` without triggering a compiler error message.

Just to emphasise the compile-time aspect: if you inspect the assembler you'll see

`````` movl    \$47, 4(%esp)
movl    std::cout, (%esp)
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
``````

and you can plug `result::value` into anywhere that needs a compile-time constant e.g 'C'-array dimensions, integer template arguments, explicit enum values...

Practical applications ? Hmmm...

Delicious. Shouldn't be too hard to do without boost either.
+1 for compiler abuse
A:

## Bourne Shell

``````quadratic(){
eval "\${quadratic:=f}(){ let r=\${a:=1}*\\$x*\\$x+\${b:=1}*\\$x+\${c:=1} ; echo \\$r ; }"
}
``````

To use it, you need to set `a`, `b`, and `c`:

``````a=1; b=-79; c=1601; quadratic=f; quadratic
``````

(The `quadratic` function defaults to setting the constants to 1, but it's best not to rely on that.) Here's how to get the results:

``````\$ x=42;f;g
47
1847
``````

Tested with `ksh` and `bash`.

Note: fails the floating-point requirement. You could use `bc` or some such in the body of the `quadratic` function to implement it, but I don't think it would be worth the effort.

+1  A:

Actionscript 2 or 3:

``````function findQuadradic( a:Number, b:number, c:Number ):Function
{
var func:Function = function( x:Number ){
return
a * Math.pow( x, 2 ) +
b * Math.pow( x, 1 ) + // TECHNICALLY more correct than * x.
c * Math.pow( x, 0 );  // TECHNICALLY more correct than * 1.
}

``````

More interestingly, you could do it another way:

`````` function findExponential( ...a:Array ):Function{
// in AS2, replace this with findExponential():Function{
var args:Array = arguments.concat() // clone the arguments array.
var retFunc:Function = function( x:Number ):Number{
{
var retNum:Number = 0;
for( var i:Number = 0; i < args.length; i++ )
{
retNum += arg[ i ] * Math.pow( x, args.length - 1 - i );
}
return retNum
}
}
``````

Now you could do:

``````  var quad:Function = findExponential( 1, -79, 1601 );
``````

Or

``````  var line:Function = findExponential( 1, -79 );
return line( 42 );
``````
+2  A:

## Mathematica

``````quadratic[a_, b_, c_] := a #^2 + b # + c &
Print[f[42]];
``````

47

Generalization to arbitrary polynomials:

``````poly[a__]:= With[{[email protected]{a}},Evaluate[Table[#,{n}]^[email protected][0,n-1].{a}]&]
poly[1,-79,1601][42]
``````

47

+17  A:

## C - no globals, no non-standard library

Not pretty, and not very well generalized, but...

``````typedef struct tagQuadraticFunctor QuadraticFunctor, *PQuadraticFunctor;

double a;
double b;
double c;
};

return f->a * x * x + f->b * x + f->c;
}

rtn.a = a;
rtn.b = b;
rtn.c = c;
return rtn;
}

int main(){

double ans = f.exec(&f, 42);

printf("%g\n", ans);
}
``````

and here's a version that generalizes the functor a little more, and now it's really starting to look like C wannabe C++:

``````#include <stdarg.h>

typedef struct tagFunctor Functor, *PFunctor;

typedef void (*Exec)(PFunctor f, void *rtn, int count, ...);

struct tagFunctor{
void *data;
Exec exec;
};

void ExecQuadratic(PFunctor f, void *rtn, int count, ...){
if(count != 1)
return;

va_list vl;
va_start(vl, count);
double x = va_arg(vl, double);
va_end(vl);

double *args = (double*)f->data;
*(double*)rtn = args[0] * x * x + args[1] * x + args[2];
}

Functor Quadratic(double a, double b, double c){
Functor rtn;
rtn.data = malloc(sizeof(double) * 3);
double *args = (double*)rtn.data;
args[0] = a;
args[1] = b;
args[2] = c;
return rtn;
}

int main(){
Functor f = Quadratic(1, -79, 1601);

double ans;
f.exec(&f, &ans, 1, 42.0); // note that it's very important
// to make sure the last argument
// here is of the correct type!

printf("%g\n", ans);

free(f.data);
}
``````
I was really hoping to get an ANSI C answer and here it is. Interesting to compare this with the highest voted languages.
It does illustrate some of the many ways in which C is starting to really show its age. Nevertheless, that beat-up old screwdriver you keep handy on the workbench is sometimes just the right tool for the job, eh? But not THIS job, me thinks.
It is amazing how much code this takes for such a simple example. Just look at all the other languages!
Zifre, you're not looking at end to end comparison, ie generated code, layers it has to hit.. Plus if you use C++ it can be shorter than most. Look up the old boost, or now tr1 and then look up how it varies between debug and release.. A beast really and smashes most examples below at runtime and compile time..
blegh, this is so not the right way to use C
+1  A:

# Oz/Mozart

``````declare

fun {\$ X}
A*X*X + B*X + C
end
end

F = {Quadratic 1.0 ~79.0 1601.0}

in

{Show {F 42.0}}
``````

I think it's interesting that Oz does not have special syntax for unnamed functions. Instead, it has a more general concept: The "nesting marker", which marks the return value of an expression by its position.

+1  A:

Clojure

The first call creates a polynomial function by grouping multiplications, in the example (a x^2 + b x + c) => (((a) x + b) x + c) The second created the poly and evaluates it.

``````(defn polynomial [& a] #(reduce (fn[r ai] (+ (* r %) ai)) a))

((polynomial 1, -79, 1601 ) 42)   ; => 47
``````
+1  A:

# JavaScript 1.8

``````function quadratic(a, b, c)
function(x)
a*(x*x) + b*x +c
``````
+4  A:

## D

``````void main () {

auto f = quadratic (1, -79, 1601);

writefln ( f(42) );
}

float delegate (float) quadratic (float a, float b, float c) {

return (float x) { return a*(x*x) + b*x + c; };
}
``````
+4  A:

C# 2.0

Create a delegate named QuadraticFormula with the following return type and parameter

``````delegate float QuadraticFormula(float x);
``````

create static method named CreateFormula to return delegate QuadraticFormula

``````class Program
{

static void Main(string[] args)
{

QuadraticFormula formula = CreateFormula(1, 2, 1);

Console.WriteLine(formula(-1));
}

static QuadraticFormula CreateFormula(float a, float b, float c)
{
return delegate(float x)
{
return a * x * x + b * x + c;
};
}
}
``````
A:

## R

``````quadratic <- function(a, b, c) {
function(x) a*x*x + b*x + c
}

f(42)
g(42)
``````
A:

# PostScript

With no named local variables (though you could use them if you want... :p).

``````/quadratic {[4 1 roll {3 index dup mul 4 3 roll mul add 3 1 roll mul add}

/f 1 -79 1601 quadratic def
/g 1 1 41 quadratic def

42 f =
42 g =
``````

Returns

``````47
1847
``````

Of course, you don't need to name these functions either. Here's a completely anonymous version:

``````42 dup {[4 1 roll {3 index dup mul 4 3 roll mul add 3 1 roll mul add}
aload pop] cvx} exch 1 -79 1601 4 index exec exec = 1 1 41 4 3 roll exec exec =
``````