Задать вопрос
  • Как грамотно написать интерпретатор?

    1. Как в рантайме правильнее разграничить вызов нативных (реализованных на Java) функций и вызов функций на JavaScript (это весьма разные сущности)?

    Ну сделай разные классы для разных функций. JS динамически типизированный, так что в основном ты все равно будешь работать с каким-нибудь базовым абстрактным JsValue, от него и унаследуй классы функций. У класса JsValue сделай метод

    JsValue call(scope: JsScope, context: JsValue, args: ArrayList<JsValue>)

    который кидает TypeError: бла-бла-бла is not a function, а в классах функций (JsNativeFunction и JsFunction) переопредели его чтобы возвращал что-то.

    2. Как оптимальнее хранить scopes? Через Hashtable/HashMap в виде вектора (имитация стека) - нормальное решение?

    Я не эксперт, но я делал скоуп в виде хешмапа со ссылкой на родительский скоуп (и так по ссылкам можно было соответственно дойти до глобального скоупа), вроде нормальный вариант.

    3. Как правильно организовать поиск функций в цепочке прототипов объекта? Например, мы ищем функцию; она находится в прототипе, ссылку на который мы храним. Но при вызове такая функция должна работать с полями данных исходного объекта, а не прототипа, или прототипа прототипа и т.д. В JavaScript всё будет в такой ситуации работать корректно, а как такое грамотно эмулировать?

    Не вижу проблемы. x.foo(42) разворачивается во что-то типа этого:

    JsObject xVar = scope.getVar("x");
    xVar
        .attr("foo")    // ищет атрибут в объекте или в прототипе
        .call(scope, xVar, Arrays.asList(JsInt(42)));

    Второй параметр метода call - это и есть контекст, то есть объект у которого вызывается метод.

    4. Эффективный алгоритм разбора выражений тоже не помешал бы. Как быстро разобрать строку, зная приоритеты операторов, корректно выделить все круглые скобки, которые могут быть вложены друг в друга, и т.д. Ссылки на любую литературу, в том числе англоязычную, приветствуются.

    Тут вряд ли что-то толковое подскажу, кроме как посмотреть в сторону ANTLR и аналогов.

    P. S.
    Немного литературы по теме
    Ответ написан
  • Можно ли решить 27 задание ЕГЭ на kotlin?

    Формально скорее всего можно, на самом деле не нужно. Возьмите Python - основы синтаксиса за месяц выучите, для ЕГЭшных задачек он подходит идеально.
    Ответ написан
    Комментировать
  • Зачем использовать functor?

    Функтор, в контексте функионального программирования — это интерфейс (или тайпкласс), который может быть реализован для разных типов. Чтобы тип мог имплементировать функтор, он должен иметь кайнд * -> * (то есть это должен быть дженерик с одним параметром) и для него должна быть реализована функция map:

    map :: Functor f => (a -> b) -> (f a -> f b)

    Имя и сигнатура могут отличаться в зависимости от реализации, например в Haskell эта функция называется fmap, а в Fantasy Land сигнатура выглядит так:

    map :: Functor f => f a ~> (a -> b) -> f b

    Также для функции/метода map должны выполняться определённые законы, не буду их копировать сюда, просто оставлю ссылку: https://github.com/fantasyland/fantasy-land#functor

    Несколько примеров функторов:
    • Arraymap применяет функцию к каждому элементу массива.
    • Futuremap применяет функцию к значению когда оно зарезолвится.
    • Maybemap применяет функцию к значению, если оно существует, иначе возвращает Nothing.
    Ответ написан
    1 комментарий
  • Как сделать скрипт на Python в который уже включены нужные библиотеки?

    Есть всякие упаковщики (вроде PyInstaller), которые собирают скрипт с интерпретатором и всеми зависимостями в один exe-файл. Гуглите "python to exe", на первой странице всё будет.
    А на счёт упаковки скрипта с зависимостями, но без интерпретатора не слышал, да и это не всегда возможно — если какая-то из зависимостей использует нативные расширения, то в любом случае придётся эти расширения отдельно тащить.
    Ответ написан
    2 комментария
  • Как привести словесный пример полиморфизма?

    Полиморфизм бывает трёх типов: параметрический, ad-hoc и полморфизм подтипов.

    Параметрический полиморфизм нужен чтобы писать логику, параметризованную типами, реализующими некоторые интерфейсы (вырожденный случай - параметризованные любыми типами). Простейший пример: функция map, применяющая функцию к каждому элементу массива. Без полиморфизма мы бы писали отдельную функцию для каждого типа:

    mapIntFloat :: (Int -> Float) -> [Int] -> [Float]
    mapIntFloat f [] = []
    mapIntFloat f (x:xs) = (f x) : (map f xs)
    
    mapIntString :: (Int -> String) -> [Int] -> [String]
    mapIntString f [] = []
    mapIntString f (x:xs) = (f x) : (map f xs)
    -- и так далее


    Выходит довольно громоздко и налицо повторение логики в каждой функции вида mapTypeType. Чтобы избежать повторения логики, параметризуем функцию map относительно типов исходного массива и массива, получаемого в результате:

    map :: forall a b. (a -> b) -> [a] -> [b]
    map f [] = []
    map f (x:xs) = (f x) : (map f xs)


    Теперь вместо конкретных типов вроде Int или Float у нас переменные типов: a и b.

    Окей, но если копнуть глубже, оказывается, что логика, похожая на map для массивов, применима и к другим типам. Например, к optional-значениям. Без ad-hoc полиморфизма мы напишем что-то типа:

    mapList :: forall a b. (a -> b) -> [a] -> [b]
    mapList f [] = []
    mapList f (x:xs) = (f x) : (mapList f xs)
    
    mapMaybe :: forall a b. (a -> b) -> Maybe a -> Maybe b
    mapMaybe f Nothing = Nothing
    mapMaybe f (Just x) = Just (f x)


    Видно, что логика везде примерно одна и та же, сигнатуры совпадают с точностью до параметризванного типа. Вот для этих случаев и нужен ad-hoc полиморфизм:

    class  Functor f  where
        map :: (a -> b) -> f a -> f b


    Мы параметризовали нужную нам логику относительно параметризованного типа f и теперь можем писать реализации для конкретных типов:

    instance  Functor Maybe  where
        map f Nothing = Nothing
        map f (Just x) = Just (f x)
    
    instance  Functor [] where
        map f [] = []
        map f (x:xs) = (f x) : (map f xs)


    Сама функция map теперь имеет тип:

    map :: forall f a b. Functor f => (a -> b) -> f a -> f b


    Теперь мы можем писать функции, которые работают с любыми функторами, то есть опять-таки сократить повторение логики в коде.

    Наконец, полиморфизм подтипов - это несколько другой подход к предыдущей проблеме. Вместо выделения общего интерфейса мы создаём базовый тип и наследуем от него остальные. В этом случае Functor будет абстрактным классом с абстрактным методом map, от которого наследуются типы Maybe, List и т.д. В таком случае сигнатура функции, принимающей и возвращающей функтор, будет выглядеть примерно так: foo :: Functor Int -> Functor String.
    Ответ написан
    1 комментарий
  • Кодовый редактор на Android?

    DroidEdit
    Vim/NeoVim в Termux
    AIDE для Java
    QPython для Python
    Ответ написан
    Комментировать
  • Как создать get и set в функции-конструкторе?

    function Foo() {
      let counter = 0;
      
      Object.defineProperty(this, "counter", {
        get() {
          return counter++;
        }
      })
    }
    
    const foo = new Foo();
    
    foo.counter;    // => 0
    foo.counter;    // => 1
    Ответ написан
    2 комментария
  • Какие книги почитать по функциональному программированию?

    Начинать изучение функциональщины, я считаю, стоит с Haskell. Функциональный код можно писать и на Scala, и даже на JS, но Haskell с точки зрения изучения ФП хорош тем, что он навязывает функциональный стиль, так что не будет соблазна решить задачу в привычном императивном стиле.

    Начать можно с лекций Дениса Москвина по лямбда-исчислению:

    1. https://youtu.be/7BPQ-gpXKt4
    2. https://youtu.be/nyulPOcDLGM
    3. https://youtu.be/S-mqZrmUUqU


    Конкретно по Haskell могу посоветовать книгу Антона Холомьёва.
    Ответ написан
    3 комментария
  • Как собрать свой объект из Interface?

    activityType это же массив, у него нет поля name
    Ответ написан
  • С чего начать в функциональном программировании на js?

    Еще я понял, что ramda это самая близкая к фп библиотека , а другие что то типо либ общего назначения.

    Это так. В Ramda все функции каррированы из коробки, аргументы передаются в удобном для функционального стиля порядке, функции не мутируют данные, а создают новые копии.

    Подскажите с какой библиотеки лучше начать.

    Определённо, с Ramda.

    А может Elm?

    Если уже знаете JS то проще будет начать с Ramda. Хотя Elm жёстче в плане соблюдения правил функционального подхода.

    Еще такая проблема , что я обычно читаю документацию с плагином google translate и нормально понимаю смысл, но с фп у меня так не выходит (пытался читать документацию ramda и underscore). Может сталкивались с переводами документаций или их подобиями?

    Учите английский. Без него изучать программирование в любом случае затруднительно.

    Алсо, маст хэв для ФП в JS - Fantasy Land (можно добавить ещё Static Land). Но это следующий уровень, после того как освоите основные приёмы ФП и прочитаете пару статей о монадах, функторах и т.д.
    Ответ написан
    Комментировать
  • Как скопировать в vim, чтобы вставить во внешний файл?

    Если перед командой копирования нажать двойную кавычку, то следующей клавишей выбирается регистр, в который текст копируется. Регистр + - это как раз системный буфер обмена, в который нужно копировать, чтобы вставить в другой программе. Так что копирование текущей строки в системный буфер обмена производится следующей командой: "+yy, копирование параграфа - "+yip, ну и так далее.
    Ответ написан
  • Какие знания нужны хакеру?

    Чтобы стать "хакером" для начала надо научиться пользоваться интернетом. Этот вопрос уже поднимали на тостере десятки раз, достаточно было просто вбить "как стать хакером" в строку поиска на тостере.
    Ответ написан
    Комментировать
  • Есть книжка для изучения Си с примерами на Микро Контроллерах?

    А смысл это совмещать? Пока не изучите основы Си, под микроконтроллеры Вы ничего не напишете. Так что берите K&R, читайте, решайте задачки, как хотя бы немного уверенно себя чувствовать начнёте (разберётесь в основном синтаксисе, в структурах, функциях, макросах, указателях, битовых опирациях) - смотрите туторы по микроконтроллерам уже.
    Ответ написан
    3 комментария
  • Как расширить чужую python-библиотеку?

    Создать класс, наследующийся от library.Api. Либо реализовать нужную логику в виде отдельной функции, а не метода:
    #...
    api = library.Api(API_URL, LOGIN, PASSWORD)
    get_something_specific(api)
    Ответ написан
    5 комментариев
  • В чем разница между Django, Flask и Angular, Backbone?

    Везде можно подключить БД

    На фронтенде БД будет храниться в браузере, т.е. этим данным доверять нельзя. В БД на клиенте могут храниться данные, необходимые для оффлайн-работы приложения, например.

    можно сделать сайт отдельно на каждом из фреймворков

    Вы явно не понимаете про фронтенд и бэкенд. На Django или Flask можно сделать серверную часть сайта. На Angular или Backbone - клиентскую. И никак иначе. Поэтому если приложению нужен сервер - на одном ангуляре Вы его не напишете. Аналогично, если нужна сложная логика на клиенте, джанго тут ничем не поможет.

    Почему просто не сделать все на одном?

    Как минимум потому что языки на сервере и на клиенте зачастую разные (тот же Python на сервере и JS На клиенте например). Вообще, есть фулстек фреймворки типа Meteor, которые позволяют писать изоморфный код, но как-то особой популярности они не получили насколько я могу судить.
    Ответ написан
    Комментировать
  • Подключение библиотек в PyCharm?

    PyCharm к используемым библиотекам никакого отношения не имеет. Используйте pip для установки пакетов Python.
    Ответ написан
  • Как написать метод, чтобы конвертировать объект в массив?

    function toArray(obj) {
      const arr = [];
      for (let key in obj) {
        arr[key] = obj[key];
      }
      return arr;
    }

    P.S. Прототипы встроенных объектов не расширяют, вместо этого используйте отдельную функцию.
    Ответ написан
    Комментировать
  • Прототипное наследование быстрее или функциональное?

    Ну во-первых, как уже было отмечено, никакого "функционального наследования" не существует. Во-вторых, наследование в принципе костыль. В 2к17 вместо наследования используют композицию и делегирование.
    Ответ написан
    Комментировать
  • Что изучать jQuery или чистый JavaScript?

    Глупый вопрос. Конечно в первую очередь нужно учить язык, а потом уже, при необходимости, библиотеки/фреймворки используемые с этим языком. Ну и вообще JQuery сейчас теряет актуальность, так что делать упор на изучение JQuery значит закопать себя в вёрстке лендингов, тогда как с хорошим знанием JS и его паттернов можно пилить всякие интересные крутые штуки.
    Ответ написан
    Комментировать
  • Как автоматически реализовать некие методы для всех типов, реализующих некий трейт?

    1. Можно создать новый трейт, который будет расширять стандартный:
    use std::io::Read;
    
    trait ReadOneByte: Read {
        fn read_one_byte(&mut self) -> Option<u8>;
    }
    
    impl<T: Read> ReadOneByte for T {
        fn read_one_byte(&mut self) -> Option<u8> {
            let mut buf = [0u8];
            match self.read(&mut buf) {
                Ok(count) if count == 1 => Some(buf[0]),
                _ => None,
            }
        }
    }


    2. А вообще-то лучше использовать обычные функции:
    fn read_one_byte<T: Read>(source: &mut T) -> Option<u8> {
        let mut buf = [0u8];
        match self.read(&mut buf) {
            Ok(count) if count == 1 => Some(buf[0]),
            _ => None,
        }
    }
    Ответ написан
    8 комментариев