JS: Составные данные

Рациональные числа

Катерина Шевцова

доброго вечера!

/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20 return pair('car'); ^ TypeError: pair is not a function at car (/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20:10) at Object.toString (rational.js:10:33) at Object.<anonymous> (test.js:14:12)

не совсем понимаю, что значит пара не является функцией . какая именно пара?!... вот код:

export const make = (x, y)=> cons(x, y); export const numer =(d)=> car(d); export const denom =(d)=> cdr(d); export const toString =(d)=> `${car(d)} / ${cdr(d)}`; export const isEqual =(x, y)=> { if(car(x)*cdr(y)===car(y)*cdr(x)){return true} else {return false} }; export const add = (x, y)=> { return (car(x)*cdr(y)+car(y)*cdr(x))/(cdr(x)*cdr(y)); }; export const sub = (x, y)=> { return (car(x)*cdr(y)-car(y)*cdr(x))/(cdr(x)*cdr(y)); }; export const mul = (x, y)=> { return (car(x)*car(y))/(cdr(x)*cdr(y)); }; export const div = (x, y)=> { return (car(x)*cdr(y))/(cdr(x)*car(y)); };

Катерина Шевцова

make: Entering directory `/usr/src/app' babel-node --presets=es2015 test.js /usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20 return pair('car'); ^ TypeError: pair is not a function at car (/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20:10) at numer (rational.js:6:28) // export const numer =(dr)=> car(dr); at Object.toString (rational.js:10:41) // export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`}; at Object.<anonymous> (test.js:14:12) // rational.toString(rational.add(rat1, rat2)),

Роман Лахтадыр

Во первых, вы не пользуетесь абстракциями. Вы это нигде не используете:

export const make = (x, y)=> cons(x, y); export const numer = (d) => car(d); export const denom = (d) => cdr(d);

Во вторых, результатом математических операций над рациональными числами должны быть тоже рациоанльные числа, а у вас числовой результат.

Катерина Шевцова

assert.equal( rational.toString(rational.add(rat1, rat2)), rational.toString(rational.make(25, 6)) );

Роман Лахтадыр

это особенность динамических языков програмирования. ошибки проявляются в момент выполнения кода. и место, в котором ошибка проявилась совсем не обязательно будет совпадать с местом, где эта ошибка допущена.

ваша функция toString уверена в том, что ей в качестве аргумента будет передана пара, но add возвращала совсем не пару. поэтому при попытке выполнить car на не паре return pair('car');, возникала ошибка pair is not a function.

Катерина Шевцова

да! спасибо!! скобки были лишние в add!

но почему в тесте была отсылка к toString? эта функция ведь не имеет отношения к ошибке..

at numer (rational.js:6:28) // export const numer =(dr)=> car(dr); at Object.toString (rational.js:10:41) // export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`}; at Object.<anonymous> (test.js:14:12) // rational.toString(rational.add(rat1, rat2)),

Роман Лахтадыр

Посмотрите на последнюю строчку из этого трейса:

at Object.<anonymous> (test.js:14:12)

строка 14 - посмотрите какая операция там тестируется. скоее всего эта операция возвращает не пару. возможно у вас там скобки лишние.

Катерина Шевцова

сделано! все равно так же ругается(

export const make = (x, y)=> cons(x, y); export const numer =(dr)=> car(dr); export const denom =(dre)=> cdr(dre); export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`}; //console.log(toString); export const isEqual =(x, y)=> { if(numer(x)*denom(y)===numer(y)*denom(x)){return true} else {return false} }; export const add = (x, y)=> { return make(numer(x)*denom(y)+numer(y)*denom(x)), (denom(x)*denom(y)); }; export const sub = (x, y)=> { return make(numer(x)*denom(y)-numer(y)*denom(x)), (denom(x)*denom(y)); }; export const mul = (x, y)=> { return make(numer(x)*numer(y)), (denom(x)*denom(y)); }; export const div = (x, y)=> { return make(numer(x)*denom(y)), (denom(x)*numer(y)); };

Роман Лахтадыр

Что именно теперь пишет?

Катерина Шевцова

отладочная печать не помогла, хотя возможно я как то не так использую ее в абстракциях..