Skip to content

Commit 3c4af93

Browse files
committed
L10n fr for final exercises: currying, function call.
1 parent 2bb9f11 commit 3c4af93

File tree

7 files changed

+194
-3
lines changed

7 files changed

+194
-3
lines changed

exercises/currying/exercise.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
var runner = require('../runner')
88

9-
module.exports = runner.custom(function(curryN) {
9+
var exercise = module.exports = runner.custom(function(curryN) {
1010
function add3(one, two, three) {
1111
return one + two + three
1212
}
@@ -27,8 +27,10 @@ module.exports = runner.custom(function(curryN) {
2727
return Array.prototype.concat.apply([], args).join(" ");
2828
}
2929

30+
var words = exercise.__('five_words').split(',')
31+
var call = words.map(function(word) { return "('" + word + "')" }).join('')
3032
result.push(
31-
"curryN(strConcat, 5)('This')('problem')('has')('been')('solved')) => " +
32-
curryN(strConcat, 5)('This')('problem')('has')('been')('solved'))
33+
"curryN(strConcat, 5)" + call + ") => " +
34+
curryN(strConcat, 5)(words[0])(words[1])(words[2])(words[3])(words[4]))
3335
return result
3436
}).hideInput()

exercises/currying/problem.fr.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
Voici un exemple d’implémentation de `curry3()`, qui « curryfie » jusqu’à 3 arguments :
2+
3+
```js
4+
function curry3(fun){
5+
return function(three){
6+
return function(two){
7+
return function (one){
8+
return fun(one, two, three)
9+
}
10+
}
11+
}
12+
}
13+
```
14+
15+
Si nous devions utiliser cette implémentation avec la fonction d’exemple suivante :
16+
17+
```js
18+
function abc(one, two, three) {
19+
return one/two/three
20+
}
21+
```
22+
23+
Ça donnerait quelque chose comme ça :
24+
25+
```js
26+
var curryC = curry3(abc)
27+
var curryB = curryC(2)
28+
var curryA = curryB(3)
29+
30+
console.log(curryA(6)) // => 1
31+
```
32+
33+
# Défi
34+
35+
Dans cet exercice, nous allons implémenter la fonction `curry()` pour un nombre quelconque d’arguments.
36+
37+
`curryN()` acceptera deux paramètres :
38+
39+
* `fn` : la fonction à « curryfier ».
40+
* `n` : un nombre optionnel d’arguments à « curryfier ». Si cet argument est manquant, `curryN()` utilisera l’arité de `fn` à la place (c’est-à-dire son nombre de paramètres déclarés).
41+
42+
## Exemple
43+
44+
```js
45+
function add3(one, two, three) {
46+
return one + two + three
47+
}
48+
49+
var curryC = curryN(add3)
50+
var curryB = curryC(1)
51+
var curryA = curryB(2)
52+
console.log(curryA(3)) // => 6
53+
console.log(curryA(10)) // => 13
54+
55+
console.log(curryN(add3)(1)(2)(3)) // => 6
56+
```
57+
58+
## Conditions
59+
60+
* N’utilisez ni boucle (`for`, `while`…) ni `Array.prototype.forEach`
61+
62+
## Conseil
63+
64+
On peut détecter l’arité d’une fonction avec la propriété `.length` de celle-ci.
65+
66+
## Base de travail
67+
68+
```js
69+
function curryN(fn, n) {
70+
// VOTRE SOLUTION ICI
71+
}
72+
73+
module.exports = curryN
74+
```
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
function curryN(fn, n) {
2+
// Si l’argument `n` est absent, on utilise la propriété `.length` de la fonction.
3+
if (typeof n !== 'number') n = fn.length
4+
5+
function getCurriedFn(prev) {
6+
return function(arg) {
7+
// Concatène l’argument qui vient d’être passé avec le tableau des arguments
8+
// déjà spécifiés.
9+
var args = prev.concat(arg)
10+
// Si tous les arguments ne sont pas encore pré-remplis, renvoie
11+
// la version currifiée de la fonction originale.
12+
if (args.length < n) return getCurriedFn(args)
13+
// Sinon, invoque la fonction d’origine avec les arguments, et
14+
// renvoie sa valeur de retour.
15+
else return fn.apply(this, args)
16+
};
17+
}
18+
19+
// Renvoie une version currifiée de la fonction d’origine.
20+
return getCurriedFn([])
21+
}
22+
23+
module.exports = curryN
24+
25+
// Source de cette solution :
26+
// http://benalman.com/news/2012/09/partial-application-in-javascript/#manually-specifying-function-arity
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
## Défi
2+
3+
Écrivez une fonction qui vous permet d’utiliser `Array.prototype.slice` sans avoir à utiliser
4+
`.call` pour l’invoquer.
5+
6+
En temps normal, vous devriez appeler `slice()` à l’aide de `call()` ou `apply()` :
7+
8+
```js
9+
var slice = Array.prototype.slice
10+
11+
function() {
12+
var args = slice.call(arguments) // ça marche
13+
}
14+
```
15+
16+
Nous, on veut que le code suivant marche :
17+
18+
```js
19+
var slice = yourFunction
20+
21+
function() {
22+
var args = slice(arguments) // ça marche
23+
}
24+
```
25+
26+
## Exemple
27+
28+
Votre fonction `slice()` devrait avoir le comportement suivant :
29+
30+
```js
31+
var nums = [1,2,3,4,5]
32+
33+
// Votre fonction slice doit correspondre au comportement
34+
// de la fonction slice standard, à ceci près qu'elle reçoit
35+
// le tableau comme premier argument.
36+
37+
slice(nums, 0, 2) // [1, 2]
38+
slice(nums, 1, 2) // [2]
39+
40+
// Avec le slice standard, pour comparaison
41+
nums.slice(0, 2) // [1, 2]
42+
nums.slice(1, 2) // [2]
43+
```
44+
45+
## Conditions
46+
47+
* N’utilisez ni boucle (`for`, `while`…) ni `Array.prototype.forEach`
48+
* N’utilisez pas le mot-clé `function` :D
49+
50+
## Conseils
51+
52+
* La solution fait une seule ligne. Même pas longue.
53+
* Tout fonction JavaScript hérite de méthodes telles que `call()`, `apply()` et `bind()`, provenant de l’objet `Function.prototype`.
54+
* `Function#call()` fonctionne quelle que soit la fonction sur laquelle on l’appelle (par exemple dans `someFunction.call()`, `this` à l’exécution sera `someFunction`).
55+
* `Function#call()` est elle-même une fonction, et hérite donc de `Function.prototype` :
56+
57+
```js
58+
function myFunction() {
59+
console.log("J’ai appelé ma fonction")
60+
}
61+
62+
Function.prototype.call.call(myFunction) // => "J’ai appelé ma fonction"
63+
```
64+
65+
## Base de travail
66+
67+
```js
68+
module.exports = // VOTRE SOLUTION ICI !
69+
```
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Explication :
2+
//
3+
// La valeur de `this` dans `Function#call()` est la fonction
4+
// sur laquelle on appelle `call()`.
5+
//
6+
// `bind()` renvoie une nouvelle fonction dont la valeur de
7+
// `this` est définie à ce qu’on lui a passé comme premier argument.
8+
//
9+
// Toute fonction « hérite » `Function.prototype`, et donc toute fonction,
10+
// y compris `call()`, `apply()` et `bind()`, a les méthodes `apply()`
11+
// et `bind()`.
12+
//
13+
// Function.prototype.call === Function.call
14+
module.exports = Function.call.bind(Array.prototype.slice)

i18n/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141
"all_loaded": "All %d users loaded!",
4242
"bad_result": "expected: \n%s\n but got:\n%s",
4343
"took_too_long": "Took too long!"
44+
},
45+
"Currying": {
46+
"five_words": "This,problem,has,been,solved"
4447
}
4548
}
4649
}

i18n/fr.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@
6161
"all_loaded": "L’ensemble des %d utilisateurs a été chargé !",
6262
"bad_result": "j’attendais : \n%s\n mais j’ai reçu :\n%s",
6363
"took_too_long": "Ça a pris trop longtemps !"
64+
},
65+
"Currying": {
66+
"five_words": "Ce,problème,est,désormais,résolu"
6467
}
6568
}
6669
}

0 commit comments

Comments
 (0)