Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Function object, NFE #176

Merged
merged 8 commits into from
Feb 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
function makeCounter() {
let count = 0;

// ... your code ...
// ... codul vostru ...
}

let counter = makeCounter();

alert( counter() ); // 0
alert( counter() ); // 1

counter.set(10); // set the new count
counter.set(10); // setează noul count

alert( counter() ); // 10

counter.decrease(); // decrease the count by 1
counter.decrease(); // scade count cu 1

alert( counter() ); // 10 (instead of 11)
alert( counter() ); // 10 (în loc de 11)
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
describe("counter", function() {

it("increases from call to call", function() {
it("crește de la un apel la altul", function() {

let counter = makeCounter();

Expand All @@ -11,7 +11,7 @@ describe("counter", function() {


describe("counter.set", function() {
it("sets the count", function() {
it("setează count", function() {

let counter = makeCounter();

Expand All @@ -23,7 +23,7 @@ describe("counter", function() {
});

describe("counter.decrease", function() {
it("decreases the count", function() {
it("scade count", function() {

let counter = makeCounter();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@

The solution uses `count` in the local variable, but addition methods are written right into the `counter`. They share the same outer lexical environment and also can access the current `count`.
Soluția folosește `count` în variabila locală, dar metodele de adăugare sunt scrise direct în `counter`. Acestea împart același mediu lexical extern și pot accesa de asemenea `count` curent.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ importance: 5

---

# Set and decrease for counter
# Set și decrease pentru counter

Modify the code of `makeCounter()` so that the counter can also decrease and set the number:
Modificați codul din `makeCounter()` astfel încât numărătorul să poată de asemenea să scadă și să seteze numărul:

- `counter()` should return the next number (as before).
- `counter.set(value)` should set the counter to `value`.
- `counter.decrease()` should decrease the counter by 1.
- `counter()` ar trebui să returneze următorul număr (ca înainte).
- `counter.set(value)` ar trebui să seteze counter la `value`.
- `counter.decrease()` ar trebui să scadă counter cu 1.

See the sandbox code for the complete usage example.
Consultați codul sandbox pentru exemplul complet de utilizare.

P.S. You can use either a closure or the function property to keep the current count. Or write both variants.
P.S. Puteți utiliza fie un closure sau proprietatea funcției pentru a păstra numărul curent. Ori scrieți ambele variante.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
function sum(a){
// Your code goes here.
// Codul vostru aici.

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

1. For the whole thing to work *anyhow*, the result of `sum` must be function.
2. That function must keep in memory the current value between calls.
3. According to the task, the function must become the number when used in `==`. Functions are objects, so the conversion happens as described in the chapter <info:object-toprimitive>, and we can provide our own method that returns the number.
1. Pentru ca totul să funcționeze *oricum*, rezultatul lui `sum` trebuie să fie o funcție.
2. Funcția respectivă trebuie să păstreze în memorie valoarea curentă între apeluri.
3. Conform sarcinii, funcția trebuie să devină număr atunci când este folosită în `==`. Funcțiile sunt obiecte, deci conversia are loc așa cum este descrisă în capitolul <info:object-toprimitive>, iar noi putem furniza propria noastră metodă care returnează numărul.

Now the code:
Acum codul:

```js demo run
function sum(a) {
Expand All @@ -28,28 +28,28 @@ alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15
```

Please note that the `sum` function actually works only once. It returns function `f`.
Vă rugăm să rețineți că funcția `sum` funcționează de fapt o singură dată. Ea returnează funcția `f`.

Then, on each subsequent call, `f` adds its parameter to the sum `currentSum`, and returns itself.
Apoi, la fiecare apelare ulterioară, `f` adaugă parametrul său la suma `currentSum` și se returnează pe sine.

**There is no recursion in the last line of `f`.**
**Nu există recursivitate în ultima linie a funcției `f`.**

Here is what recursion looks like:
Iată cum arată recursivitatea:

```js
function f(b) {
currentSum += b;
return f(); // <-- recursive call
return f(); // <-- apel recursiv
}
```

And in our case, we just return the function, without calling it:
Și în cazul nostru, returnăm doar funcția, fără să o apelăm:

```js
function f(b) {
currentSum += b;
return f; // <-- does not call itself, returns itself
return f; // <-- nu se apelează pe sine, se returnează pe sine
}
```

This `f` will be used in the next call, again return itself, as many times as needed. Then, when used as a number or a string -- the `toString` returns the `currentSum`. We could also use `Symbol.toPrimitive` or `valueOf` here for the conversion.
Acest `f` va fi folosit în apelul următor, returnându-se din nou pe sine, de câte ori este nevoie. Apoi, atunci când este folosit ca număr sau șir --- `toString` returnează `currentSum`. De asemenea am putea folosi `Symbol.toPrimitive` sau `valueOf` aici pentru conversie.
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ importance: 2

---

# Sum with an arbitrary amount of brackets
# Sumă cu un număr arbitrar de paranteze

Write function `sum` that would work like this:
Scrieți funcția `sum` care ar funcționa astfel:

```js
sum(1)(2) == 3; // 1 + 2
Expand All @@ -14,4 +14,4 @@ sum(6)(-1)(-2)(-3) == 0
sum(0)(1)(2)(3)(4)(5) == 15
```

P.S. Hint: you may need to setup custom object to primitive conversion for your function.
P.S. Sugestie: este posibil să fie nevoie să configurați o conversie personalizată de la obiect la primitivă pentru funcția dvs.
Loading