<p>JavaScript in der Tradition der funktionalen Programmiersprachen LISP und Scheme</p>
<hr>
</div>
<divclass="exercise-item">
<divclass="exercise-description">
<h3>Funktionen in JavaScript</h3>
<hr>
</div>
<divclass="question">
Schreiben Sie eine Funktion <bold>identity_function()</bold>, die ein Argument als Parameter entgegennimmt und eine Funktion zurückgibt, die dieses Argument zurückgibt.
</div>
<divclass="solution">
function identify_function(arg){ <br>
return function(){return arg;}; <br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Addier-Funktion addf(), so dass addf(x)(y) genau x + y zurück gibt.
</div>
<divclass="solution">
function addf(x){<br>
return function(y){return x +y;};<br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Funktion applyf(), die aus einer binären Funktion wie add(x,y) eine Funktion addfberechnet, die mit zwei Aufrufen das gleiche Ergebnis liefert, z.B. addf = applyf(add); addf(x)(y) soll add(x,y) liefern.
</div>
<divclass="solution">
function applyf(fun){<br>
return function(x){<br>
return function(y){<br>
return fun(x,y);<br>
}<br>
}<br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Funktion curry() (von Currying), die eine binäre Funktion und ein Argument nimmt, um daraus eine Funktion zu erzeugen, die ein zweites Argument entgegen nimmt.
</div>
<divclass="solution">
function curry(fun,x){ <br>
return function(y){ <br>
return fun(x,y); <br>
} <br>
}
</div>
<hr>
<divclass="question">
Erzeugen Sie die inc-Funktion mit Hilfe einer der Funktionen addf, applyf und curry aus den letzten Aufgaben, ohne die Funktion inc() selbst zu implementieren.
</div>
<divclass="solution">
function inc(x){ <br>
return curry((a,b) => a +b,x)(1); <br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Funktion methodize(), die eine binäre Funktion (z.B. add, mul) in eine unäre Methode verwandelt.
</div>
<divclass="solution">
function methodize(fun){ <br>
return function(x){ <br>
return fun(this,x); <br>
} <br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Funktion demethodize(), die eine unäre Methode (z.B. add, mul) in eine binäre Funktion umwandelt.
</div>
<divclass="solution">
function demethodize(fun){ <br>
return function(x,y){ <br>
return fun.bind(x)(y); <br>
}<br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Funktion twice(), die eine binäre Funktion in eine unäre Funktion umwandelt, die den einen Parameter zweimal weiter reicht.
</div>
<divclass="solution">
function twice(fun){ <br>
return function(x){ <br>
return fun(x,x); <br>
}<br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Funktion composeu(), die zwei unäre Funktionen in eine einzelne unäre Funktion transformiert, die beide nacheinander aufruft, z.B. soll composeu(double, square)(3) genau 36 ergeben.
</div>
<divclass="solution">
function composeu(fun1,fun2){ <br>
return function(x){ <br>
return fun2(fun1(x)); <br>
} <br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Funktion composeb(), die zwei binäre Funktionen in eine einzelne Funktion transformiert, die beide nacheinander aufruft.
</div>
<divclass="solution">
function composeb(fun1,fun2){ <br>
return function(x,y,z){ <br>
return fun2(fun1(x,y),z);<br>
}<br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine Funktion once(), die einer anderen Funktion nur einmal erlaubt, aufgerufen zu werden
</div>
<divclass="solution">
function once(fun){ <br>
let i = 0; <br>
if(i <=0){<br>
++i;<br>
return function(x,y){<br>
return fun(x,y);<br>
}<br>
}<br>
console.error("Only call once!");<br>
return undefined;<br>
}<br>
</div>
<hr>
<divclass="question">
Schreiben Sie eine Fabrik-Funktion counterf(), die zwei Funktionen inc() und dec() berechnet, die einen Zähler hoch- und herunterzählen.
</div>
<divclass="solution">
function counterf(count){ <br>
return{ <br>
count: count, <br>
inc: () => ++count, <br>
dec: () => --count <br>
} <br>
}
</div>
<hr>
<divclass="question">
Schreiben Sie eine rücknehmbare Funktion revocable(), die als Parameter eine Funktion nimmt und diese bei Aufruf ausführt.
Implementieren Sie ein "Array Wrapper"-Objekt mit den Methoden get, store und append, so dass ein Angreifer keinen Zugriff auf das innere, private Array hat.