Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.07.2018, 23:54
Новичок на форуме
Отправить личное сообщение для acmra Посмотреть профиль Найти все сообщения от acmra
 
Регистрация: 01.07.2018
Сообщений: 1

Калькулятор three(times(five())); как Вызвать вот так функции чтоб получилось 15
three(times(five())); // return 15
eight(minus(two())); // return 6
one(plus(six(dividedBy(three())))); // return 3

one,two... - это все отдельные функции с одним аргументом.

как сделать так это на js, можете подсказать пожалуйста?
Ответить с цитированием
  #2 (permalink)  
Старый 02.07.2018, 01:36
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

times=a=>'*'+a;
minus=a=>'-'+a;
plus=a=>'+'+a;

one=a=>eval(1+a)||1;
two=a=>eval(2+a)||2;
three=a=>eval(3+a)||3;
five=a=>eval(5+a)||5;
eight=a=>eval(8+a)||8;


console.log(five(times(three()))); 
console.log(eight(minus(two())));
console.log(five(minus(two())));
Ответить с цитированием
  #3 (permalink)  
Старый 02.07.2018, 01:51
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

times=a=>'*'+a;
minus=a=>'-'+a;
plus=a=>'+'+a;

one=a=>eval(1+a)||1;
two=a=>eval(2+a)||2;
three=a=>eval(3+a)||3;
five=a=>eval(5+a)||5;
eight=a=>eval(8+a)||8;

console.log(five(plus(two(plus(two(plus(one())))))));
console.log(five(minus(two(minus(two(minus(one())))))));


но к сожалению самая вложенная будет выполняться раньше, из за этого мы получаем такой результат подобный 5-(2-(2-1))
Ответить с цитированием
  #4 (permalink)  
Старый 02.07.2018, 02:06
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

// константы
const constant = a => (f = x => x) => f(a);
const one   = constant(1);
const two   = constant(2);
const three = constant(3);
const five  = constant(5);
const six   = constant(6);
const eight = constant(8);

// операции
const plus      = b => a => a + b;
const minus     = b => a => a - b;
const times     = b => a => a * b;
const dividedBy = b => a => a / b;

// тесты
console.log(three(times(five())));               // return 15
console.log(eight(minus(two())));                // return 6
console.log(one(plus(six(dividedBy(three()))))); // return 3


Сообщение от j0hnik Посмотреть сообщение
Самая вложенная [функция] будет выполняться раньше, из-за этого мы получаем такой результат [...] 5-(2-(2-1))
Слова j0hnik относятся и к моему коду. Редукция выражения происходит справа налево, и не учитывается приоритет операторов... Почему бы сначала не получить выражение, а только затем его вычислить...

// константы
const constant = a => (f = x => x) => ({
    [Symbol.toPrimitive](hint) {
        return eval(this.valueOf());
    },

    valueOf() {
        return f(a);
    },

    toString() {
        return this[Symbol.toPrimitive]("string");
    }
});
const one   = constant(1);
const two   = constant(2);
const three = constant(3);
const five  = constant(5);
const six   = constant(6);
const eight = constant(8);

// операции
const operator  = sign => b => a => `${a.valueOf()} ${sign} ${b.valueOf()}`;
const plus      = operator("+");
const minus     = operator("-");
const times     = operator("*");
const dividedBy = operator("/");

// тесты
alert([
    three(times(five())),                      // 3 * 5
    eight(minus(two())),                       // 8 - 2
    one(plus(six(dividedBy(three())))),        // 1 + 6 / 3
    five(minus(two(minus(two(minus(one())))))) // 5 - 2 - 2 - 1
]);

Последний раз редактировалось Malleys, 02.07.2018 в 03:22.
Ответить с цитированием
  #5 (permalink)  
Старый 02.07.2018, 13:47
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Приоритет операций учитывается, если имеем строку вроде "1 + 2 * 3" и хотим посчитать. А здесь уже явно задано "дерево выражения", и никакого приоритета не может быть в принципе.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой собственный башорг в скайпе))) devote Оффтопик 81 03.10.2012 00:56
как вызвать две функции для OnChange jekjuk Элементы интерфейса 4 08.11.2011 17:10
способы организации кода melky Общие вопросы Javascript 17 01.10.2011 22:57
Как из функции вызвать другую функцию и правильно передать ей параметр Alexd Общие вопросы Javascript 3 06.05.2011 03:42
как сделать так, чтоб браузер смог отличить знак больше от закрытия тэга? FirstFrost Общие вопросы Javascript 8 17.07.2010 22:55