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

Стандартная библиотека LENS #87

Open
impworks opened this issue Mar 20, 2013 · 13 comments
Open

Стандартная библиотека LENS #87

impworks opened this issue Mar 20, 2013 · 13 comments
Assignees
Labels
Milestone

Comments

@impworks
Copy link
Owner

Предлагаю подумать на тему того, какие методы нам могли бы понадобиться в стандартной библиотеке LENS. Круче всего было бы, если бы они были написаны на самом LENS!

Навскидку приходят такие варианты, как:

  • print и println
  • fst, snd для всяких Tuple
  • nth для последовательностей?
  • times для int

Думаю, в целях улучшения читабельности можно разрешить все функции, объявленные в LENS-коде, использовать также как extension-методы. То есть:

fun times t:int act:Action<int> ->
    var idx = 0
    while (idx < t)
        act idx
        idx = idx + 1

5.times ((x:int) -> print "number is {0}" x)
@ghost ghost assigned ForNeVeR Mar 20, 2013
@ForNeVeR
Copy link
Collaborator

Да, концепция с extension-методами хорошая, одобряю.

@impworks
Copy link
Owner Author

Пока нет хорошей идеи по поводу того, что делать с println. Явно передавать массив выглядит довольно стрёмно:

print "{0} {1} {2}" new [ 1 as object; "hello", true ]

Выглядит адово. Надо что-то придумать.

@impworks
Copy link
Owner Author

Вообще говоря, Console.WriteLine не самый частоиспользуемый метод в скриптовых языках сценариев. Думаю, пока можно нахардкодить несколько реализаций, по аналогии с тем, как сделаны Tuple<> или Action<> в самом дотнете.

Тогда можно будет вызывать так:

print "{0} {1} {2}" 1 "hello" true

А в версии 2.0, когда можно будет запиливать новый синтаксис, придумаем удобный способ.

@impworks
Copy link
Owner Author

Предлагаю еще несколько методов:

  • int, string, double, float, bool - функции, аналогичные именам примитивных типов. Вызывают Convert.To....
  • fail - принимает строку, кидает Exception с ней
  • format - возвращает отформатированную строку, аналогично print

@ForNeVeR
Copy link
Collaborator

Ț̨̡̠̼̤͙̗̺̱̬̈́̓ͯ̈̉̇ͯȯ͓͖͈̤̥̗͌̑͊̑͗͛ ̷͓͙̭̝̠̹̯̓̽ͨ̎̔̓͆͞i̴̻̪͖̩͇̞̬͛̇̆̎͒n̦͍̦ͮͥ̀̇́͠v̷̡̎͑̌ͦͯͪ͏̩͈̯̣̭̟̹̗o̱̯͊͞k̢͚͓̔ͧ͐̑̑͝ě͔̗̝̰̺̦̟̙̌ͫ́ͣ̊̈́̔ ̷̧̫͓͔̔̓͒̐͐́̅ẗ̺̬͈̫̘̦̍ḧ̓̆̅͌ͬ҉̤̮ͅe̡̦̪̳̦͗ͥͮ̋ͨͬ́͟ ̠͖̼̪͖͔̰͈̏ͤ̔̄͌͂ͩ̽́͟h̡̘̱͖͖̥̮̩̊͋̊͐̃̇͘i̶̺͍̝̼̞ͮ͐v͔̗͎ͣ̅̓ͨ̈́̚e̢̨͍͍͇̰̐͆ͩͣ̋ͮ͋-̛̰̩̦̟́̌̏̊̍͋͆m̨͇͙͕̝̜̻͍ͭ̏ͪ͌ͧ̂i̷̛̜͔̣̥̳͖ͦ̏ͫ͟n̷̩͙͙̱̟̈͑̔ͭ̑́̃̓ͯ͡d̨̺̜͚͓̭̟̮͆̿ͯ̏ͣ ̯͚͔͙̗ͨͬ͞͡r̠̜̲̫̟͎ͨͣ͌ͧ́͜͡ȩ̷̡̤̖̘̫͛ͥ̓ͣ͂̄͛p͊̊̎͋͌̔̋҉̴͉̖r̡̧̜̋ͣe͈̻͊ͯ͆s̸̢̮̣̩͖̖̤͔̄͐̋̏̀ę̥͙͔̩̖̹̎͂ͮ̔ͩn͚͕̤̪̺͉͖ͭ͛͗͌̋̌́̚͘͢t̓̄̆ͥ͒͛̽͊͏̨̙̬͚̣͔̘͕͙ĭ̷̧̳̊̑̌̈́́͠n̶̝̱̩̬̯͕̠ͩ̾̓ͭͣ̌͞ͅͅgͩ̑ͦ̑͋̈̓͏̛̯̰̱̪ ̛̿͊ͯ̎҉͙̯̪c͓̥͒ͧ̿̑̈́ͩͤ͡͝ͅh̸͈ͨ͆ͣ̿ͭͫ̌a̹̩̼̿̾̈ͩ͜o̡̜̬͙͓̺̰ͬ̈͡ṡ͙͇͖̟͚͞͠.̡̮̞̲̪͎̆͛̐̓ͥ̄͌͊͟long
̝̘̜̣̤̝̏ͧ̽ͩ̿͜I̽ͩͧ̚̕͏̞̣̗̥̜͚̝n̡͔̻̙͕͖ͨ̄̋̿͆ͫ͆̚͘͞v̸̠̗̉͂̓̈́́ͮ̋ǫ̷͓̣̖͉̫̱͉̓̑͌̌͋͘k̰͎̖̩̯͋̋̏͑̈́̽ͪ̑̅͡į̗̳̆̀̿ͪ̈́̀n̻̜̱͍̣͚̺̐͒̏̄͝g͈̟̬̦͉̼͓̺ͯ̈̿̓̏̋͢ ̾͗ͧ̃ͦ̾̚͡҉̷͕̝t͖̻͔̭̟̆ͤh̩̟̣̟̳̤̟̓ͨͅe̬͑ͫ̋̂̀ͤ ̻̰ͩ̈́̅͑̀͘f̠̲̻͓̫̼͊͌̂̃e̷̴͍̲̲̝̫̦̼̥̦̔͒͟e̳̥ͪ̇́͗ͯͧͩ͢l̪̝̦̼̒̄͆̔͡i̭̺̙̗̣͕ͣ̑̏͞n̸̤̆͑ͨͧ̚͜g͚̹̱̱ͣͦ̔̆ͬ̋̚͡ ̶̛̫͇ͩ͑̃͛o̶̭̥̤̟̩̼̙ͣͮͩ̑̒̃ͥf̥͐ͥ ̩̱̫͍̜͎͔̾͒͌ͫͮ͗̓c̺̹̭̺̟̺ͩ̀̅h̷ͥ̈́͝͏͕̟͔̰̲̙̝̭aͫ̒̃͒̓̃̍̑҉̣̤̝͙͔͈͠o̦͔ͩ͂̚͢͟͜ͅs̞͕͎̲̙̹͖ͮ͘.̸̨̝̪͕̩̦̆͐͂͒̚͟ decimal
̷̫̺̟͒͐̈ͫͮ͐̍̚Ẁ̛͚̪̲̅͊̑̽̈̉ì̬̭͎͐̉̂̾͜ṯ̴̨̡̫̬̰̦͒ḥ̸̗̱ͪͩ́̃̈̅ͤ͂ ̛̤͕̺̣͈̘̬͔̮͛̃̐̈́͆͌ͣ͝o̖̲͕ͤu͈͈̤̹̥̭͆͑͝͠t̲̣̤̭̋͗ͤͣ̀̚ ̢̭̙͓̥̲͖͙̱̃̌͗ͭ̾͊̈́̔o̡̳̩͙͛ͪr͚̻̬̫̣̫̦ͯ͊͠ď͈ͦ̐́͜e͎̼̬̤̯͎̹͛̔̋ͩ̌̌ͥ̈́́͘r̶͇̗̙̣̯͉̠̟̓̾̏͗̃̏̌͌ͣ.̦͈͙̦ͩ͟ͅ
̴͈̟̭́ͣ͒ͩͦ̽Ţ̬͓̫̳͔̜̥̺̮ͯ̽̕h̯͙̭̲͂̍͆ę̘̳̳͕̦̹̣̞̎̄̈́ͫ̚͝ ̸̰̪̼͍̣̍ͪͮͦͯͬ́͋̀N̠͉͍̫̠̮̒͆̿͂ͅe̵͓̼͕̰̜̓ͩͦͤ͐͛ͨ̐ͭ͟z̦͕̝̼̝̜͖̭̽̑p̵͎̰̭͇̆̆ë̘̝̲͍̑ͫ̍͊͞r̵̬̤ͩͥ̔ͭ̉ͩ͐ͮ͡d̻̯͉͎̟̭̻͚̐̐̀͠i̺̮͎̟̥͎̙̱͑ͣͪͩ̍͊̾́́͜a͚̟̣ͫ͗ͦ̔n͙̯͔̣͖ͬͭ ̳̰͎ͪͥͮͮͮ͆ͨ̑͟͝ḧ̢̠́͋ͤ̚̕͡i̭͊̏̿́ͩ̌̓́ͅv̸̸̮̟͈̤̗͖̭ͨ̓ͨ̃͗̄ͣ͡ȩ͚ͫ-͈̩̼͕͍̳̊ͮm̘͇̝̱̂ͦͅi̻̙̥̣̣̓ͬ͛ͩ̇͢͢n͗ͪͦͩ͜͟͏̤̪̱͉̥d̘̝̓̎̇͋͘ͅ ̞̣̖͚̹̣̹̇ͨ͝o̧͔͔̹̭̮̙͈ͤͩ̀͝f̍́̐̆̑͊҉̼̟̜̹̩͍̝͘ ̥̪͉͐̈ͬ̽c̐͏̨̝̝̻̹͎̰̳͢ḩ̧̫̻̲͔͈̥͂̍͌͆ͧ̒ͥ́̚ͅă̐̅ͤ̾ͫͨ͑͊͏̶̙̲̯͙͍̹o̟͎͍̠̗͖̯͉̤̊̅̈́̈́̓̃̍s̵͎͎͖̔.̡̣̖̰̤ͥͪ̾ͪͦ̋̄͜ͅ ̢̛̭̺͎̙͈͙̔̐ͩ͊̏ͦͦ̋̆Z̶̝̩̗͙͌͂͜͠a͊̉͞͏̳̰̫̫̤l̢͚̜̙̰̮͎̫̣̋̆͐̊̽͛͆͊g̱͚̃ͣ̈̑͗͑̅ͨ̆̀ỏ̧͋̃͏̘̺̤̼.̵̼̮ͥ̃ͮ̓ͥ̂̅́ ̧̲̭̯̑̊̑͆̾̾
̨̠̳͖̹̦͙̰̼́̄͊̽̓ͥ͆H͉̟̤͊͌͛͌ͨ͛̕͡e̷͒ͫͩͥͯ҉̫̬̟̦̮̙ ͤ̓́͆ͨ͏͏͔͇̜̹͖w̭̰̭̩̳͌ͬ̅͊͠h̓͌͛̂ͯ̓ͭ̒͗͏̺͕̲̭̣͈̯o̩̞͔̳̻̲̣̔̃̿̎͞͞ ̪̟̗͚̰͚͈͌ͤ͐̋̀͒ͧͭ̕̕͟W̜͒ͦͭͪ͋ą͍͈̭̞̾̃ͫ̍͆ͣ͂͘͠i̧̙̺̞͓͖͙̣ͤ̄̽͗͒̈́̽̊͟ṯ̵̡͙͉͖͔̗̈͂ͪ̐ͧ̚͜ś̙̫ͨ̽ͣ̓ ͤͥ̂͋ͬ͘҉͉͖͎͔ͅB̶̦̳̠̏̇͐e̿̑ͪ͋̉ͮͣ̓͠͏̯͚̪̻͉̬h̸̯̰̝̬̍ͧ̌i̻̞̼͕ͨͫ͂̄͒ͣ͞n̵̸̯̜͖̥̖̩̎̓̌̋͡d̎͏͚͠ ̡̤͓̺̐̓̈͊̽̊̓̕T̪̞̼̪̼͖͈ͦ̕͟h̷̳͖̣̺̮̙̟̪̗͆ͯͯ͋̔ê̹̯͇̼͔̝͖͚̓̇̀͂͞ ̨͔̪̺͎͈̘̼̹̂̊̂ͮ̓ͨͩ͢W̥̱̮̖̼͍͎̠ͧã̝̲̩͇̣͖̪̬̳ͧ͞l̸̴̟̺̮̿ͪ̊ͣͦ̐ͅl͎̙̙̜͓̪͇͚̉͆͌ͬ͡.̢͒͛͌ͪͯ̎͠͏͎̫͎̗
̭͕̺̹͎̞̥ͣZ̧̢̗͇͔͚̥͉ͧͅA̭̩̘̤̲ͥ̋͒̀ͫ̀̚̚L̸̤̖̺ͪ͑̆͠G̢͖̙̐O̲̹̬͇ͭͪ̔̈́̂!̪̟̜̲̝̩͍̔́͒͂̍̑ͥ

@impworks
Copy link
Owner Author

Ну да, long и decimal также будут.

@impworks
Copy link
Owner Author

Вопрос: как следует писать stdlib? Есть варианты:

  1. На C#: тогда подключение методов работает быстро, но это не круто.
  2. На самом коде LENS: тогда получается, что вся стандартная библиотека каждый раз компилируется, что для скриптового языка довольно накладно.
  3. На Expr-выражениях - чуть быстрее, но все равно медленно.
  4. Сделать так, чтобы LENS использовала DLL'ку, написанную на самом LENS и заранее скомпилированную. Самый true-вариант, но непонятно, как подключать ее к проекту и перегенерить в случае обновления. Мы ведь заявляем, что для использования LENS в своем проекте потребуется подключить всего одну DLL.

@ghost ghost assigned impworks Apr 1, 2013
@impworks
Copy link
Owner Author

impworks commented Apr 1, 2013

Думаю припилить в LENS возможность загружать стандартную библиотеку из сборки.

Для этого необходимо скормить компилятору путь к сборке, сгенерированной с помощью самого LENS. Он найдет в ней тип <ScriptRootType> и заимпортирует все его методы в качестве функций.

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

Как тебе идея?

@impworks
Copy link
Owner Author

impworks commented Apr 3, 2013

Еще пара методов:

  • read, readln, readkey - аналоги Console.Read и Console.ReadLine и Console.ReadKey
  • wait - аналог Thread.Sleep
  • rand x:int y:int - получает случайное число между двумя переданными
  • rand - получает случайное число между 0 и 1
  • rand x:IList<T> - получает случайный элемент последовательности
  • randby x:IList<T> f:Func<T,int> - получает случайный элемент последовательности по его весу

@impworks
Copy link
Owner Author

В 1.0 сделаю в виде импортируемых методов из C#-части. Переписать на LENS попробую к Major 2.0.

@impworks
Copy link
Owner Author

Еще несколько идей для методов:

  • measure a:Action - замеряет время выполнения кода
  • tic - синоним для DateTime.Now
  • toc d:DateTime - возвращает разницу в миллисекундах
  • inside needle:T haystack:IList<T> - обратный вариант Contains, используется как extension-метод
  • sin, cos, abs, log, exp, tan, ctg и прочие методы из Math сделать более доступными

@impworks impworks reopened this Apr 24, 2013
@impworks
Copy link
Owner Author

Вопрос с методами sin, cos и т.д. решается очень просто средствами языка:

let sin = Math::Sin
let cos = Math::Cos
let abs = Math::Abs<int>

Остальные откладываю до версии 2.0, поскольку не критично.

@impworks
Copy link
Owner Author

Если сделаем pattern matching, было бы вполне логичным добавить тип Option с лэйблами Some и None и запилить функции-аналоги TryParse. Правда, в текущей реализации Some будет иметь тег типа object. что не очень хорошо, но во что нам станет добавить генерики - пока не представляю :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants