1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/diqye-defun

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Использование режима сопоставления для определения функции (use pattern match define the function)

Поддерживает следующие функции:

  1. Функция с несколькими аргументами.
  2. Сопоставление базовых типов данных, массивов и объектов.
  3. Привязка переменных.
  4. Игнорирование параметров.
  5. Тестирование функций.

Онлайн-запуск (online run) https://runkit.com/npm/defun

Использование (useage)

  • Node:
npm install defun --save
  • ES5:
var defun = require("defun").defun;
  • >= ES6:
import {defun} from 'defun'

var fn = defun({
  '"hello"':"hello",
  '(_:xs)':xs=>xs
});

console.log(fn([1,2,3])) //->[2,3]
  • Браузер: Импортируйте defun.js (размер 15 КБ):
<script src="./defun.js"></script> 

Тестирование (test): Используйте Jasmine для модульного тестирования. Путь к файлу: /test/defun-jasmine-test.html.

Демо (demo): Примеры используют некоторые функции ECMAScript 6. Для браузеров, отличных от Chrome, потребуется внести изменения.

Примеры кода (snipets):

  • Сумма массива (sum):
var sum = defun({
    "[]":0,
    "(x:xs)":(x,xs)=>x+sum(xs)
});
sum([1,2,3,4,5]);
  • Быстрая сортировка (quick sort):
var sort = defun({
    "[]":[],
    "(x:xs)":(x,xs)=>sort(xs.filter(a=>a<x)).concat(x).concat(sort(xs.filter(a=>!(a<x))))
});
sort([1,8,0,4,0]);
  • Написание логики (logic): Если это массив: — пустой массив возвращает false; — массив с заголовком «string» возвращает оставшуюся часть массива в виде строки; — в других случаях массив соединяется в строку. Если это объект: — тип — string, возвращает значение свойства value; — тип — self, возвращает сам объект; — в остальных случаях возвращает false.
var logicfn = defun({
    "[]":false,
    "('string':xs)":xs=>xs.join(""),
    "x?array":x=>x.join(""),
    "{type:'string',value:val}":val=>val,
    "@obj{type:'self'}":obj=>obj,
    "else":false
});

Документация по использованию (usage document):

  • Базовое сопоставление: Функция defun(obj) используется следующим образом: key представляет смысл данных; val представляет результат сопоставления. Пример:
var fn = defun({
    "777":'number',
    "'str'":'string',
    "[]":'empty arr',
    "{}":'empty obj',
    "else":"else"
});
fn(777)->'number' //сопоставляет "777"
fn('str')->'string' //сопоставляет "'str'"
fn([])->'empty arr' //сопоставляет "'[]'"
fn({})->'empty obj' //сопоставляет "{}"
fn(8388)->'else'    //сопоставляет "else"
  • Несколько параметров и игнорирование параметров: Сопоставьте несколько параметров, разделяя их запятыми, _ представляет игнорируемый параметр. Пример:
var fn = defun({
    "1":1,
    "1,2":2,
    "1,2,3":3,
    "1,_,3":4,
    "_,_,_":5,
    "else":"else"
});
fn(1)->1        //сопоставляет "1"
fn(1,2)->2      //сопоставляет "1,2"
fn(1,2,3)->3    //сопоставляет "1,2,3"
fn(1,3,3)->4    //сопоставляет "1,_,3" 
fn(3,3,3)->5    //сопоставляет "_,_,_"
fn(1,1,1,1,1,1,1)->"else"
  • Привязка переменных и деструктуризация массивов и объектов: (1:2:[]) сопоставляет массив, первый элемент которого равен 1, второй — 2. (x:xs) сопоставляет массив, где первый элемент привязан к x, а остальные — к xs. {a,b} сопоставляет объект, ключ a которого связан со значением a, а ключ b — со значением b. Пример:
var fn = defun({
    "(1:xs)":function(xs){return xs},
    "(a:b:c:xs)":function(a,b,c,xs){return [a,b,c,xs]},
    "(x:xs)":function(x,xs){return [x,xs]},
    "{a,b:'b'}":function(a){return a},
    "{a,b}":function(a,b){return [a,b]},
    "{a:{aa},b:'b'}":function(aa,b){return aa},
    "x":function(x){return x}
});
fn([1])->[]                     //сопоставляет "(1:xs)"
fn([1,2,3])->[2,3]              //сопоставляет "(1:xs)"
fn([2,2,3])->[2,2,3,[]]         //сопоставляет "(a:b:c:xs)"
fn([2,2,3,4])->[2,2,3,[4]]      //сопоставляет "(a:b:c:xs)" 
fn([2,2])->[2,[2]]              //сопоставляет "(x:xs)"
fn({a:1,b:'b'})->1              //сопоставляет "{a,b:'b'}"
fn({a:2,b:2})->[2,2]
fn({a:{aa:'aa'},b:'b'})->'aa'
fn(100)->100
  • ? Функция (?function): Поддерживает пользовательские функции для сопоставления. Если функция возвращает true, сопоставление успешно, иначе сопоставление не удаётся. Функции array, object, date, number, string встроены для проверки типа данных. Пользовательскую функцию можно передать в defunWithFn. Второй параметр действует в текущем диапазоне сопоставления. Также можно использовать глобальную функцию через defun.globalScope. Также можно напрямую использовать глобальные функции. Пример:
//глобально эффективно
defun.globalScope.testfn=function(a){return a=="test"}
var fn = defun({
    "x?array":true,
    "x?object":false,
    "x?testfn":'test'
});
fn([])->true
fn({a:1})->false
fn("test")->'test'
//текущий fn эффективен
var fn = defun({
    "x?array":true,
    "x?object":false,
    "x?testfn":'test'
}{
  "testfn":function(a){return a=="test"}
});

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Используйте режим сопоставления для написания функции. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/diqye-defun.git
git@api.gitlife.ru:oschina-mirror/diqye-defun.git
oschina-mirror
diqye-defun
diqye-defun
master