LINUX.ORG.RU

Вышел Boo 0.9

 , ,


0

0

Вышла новая версия языка для платформ .Net и Mono. Воо - это Python-подобный язык, но в отличие от Python имеет следующие особенности:

  • строгую типизацию
  • атрибуты доступа (private, public, protected)
  • макросы
  • генерики
Нововведения коснулись работы с макросами, генериками, интерполяции строк. Добавлена поддержка SilverLight.

>>> Подробности

★★★★

Проверено: JB ()

Ответ на: комментарий от anonymous

Анонимус безумно рад! То моно 2.0 вышел, теперь и Boo 0.9 вообще сказка!!! Видать недавний китайский новый год на них так повлиял, и теперь все идет по фен-шую!

anonymous
()
Ответ на: комментарий от anonymous

оооооо!! неужели кто-то вспомнил :)

А по теме, еще 1 никому не нужный язык?

anonymous
()
Ответ на: комментарий от AVL2

>>> def min (x,y): return x if x < y else y
>> print (min ("много","немного"))

>много

>>> print (min ("мало","совсем мало"))

>мало

>Зашибись...

>AVL2


Ну чего ты?

>>> print min ("Bulsheet", "AVL2")

AVL2

Правду же говорит - ты даже дерьма ниже! :)

anonymous
()
Ответ на: комментарий от anonymous

> Ты даже не понимаешь, что реализовать динамическую типизацию ГОРАЗДО сложнее, чем статическую.

Чем сложнее? Наляпал generic-+ (-, *, /, etc), выдаёшь в рантайме экзепшен, если слона с кроликом нельзя скрестить.

mv ★★★★★
()
Ответ на: комментарий от mv

Он имеет ввиду _эффективную_ реализаци динамической типизации. То есть неявный type inference где можно и runtime optimizations.

theos ★★★
()
Ответ на: комментарий от xTERM

> Я задолбался отлавливать в рантайме ошибки вида "данный объект не поддерживает этот метод". Задолбался писать кучи уродливых деклараций для опциональной почтистатической типизации (которая статической от этого не становится).

Да ладно, просто ты на лиспе писал в сишном стиле ;) И как-то уж очень странно выглядело, что для сетевого сервера был выбран CL, а AI написан на Си...

mv ★★★★★
()

Название языка как бы говорит само за себя.

pento ★★★★★
()
Ответ на: комментарий от theos

> Он имеет ввиду _эффективную_ реализаци динамической типизации. То есть неявный type inference где можно и runtime optimizations.

И в чём же это принципиально сложнее статической типизации?

mv ★★★★★
()
Ответ на: комментарий от tailgunner

берём пример по ссылке выше, реализуем на том лямбда-исчислении Хиндли-Милнера. ПРОФИТ!

anonymous
()
Ответ на: комментарий от tailgunner

> Это уже не динамическая типизация.

В compile-time такое можно делать. И делается, собственно говоря.

mv ★★★★★
()
Ответ на: комментарий от mv

>> Это уже не динамическая типизация.

> В compile-time такое можно делать.

В общем случае - вряд ли :) И это уже не динамическая типизация, а смесь статики и динамики.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> берём пример по ссылке выше, реализуем на том лямбда-исчислении Хиндли-Милнера. ПРОФИТ!

А алгоритм Хиндли-Милнера учитывает delattr? O_o

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

"Sadly I and Michal rather lost the motivation and time to work on the compiler, but I really hope the language will be useful to people world-wide. I still use it in one of my commercial projects, though it is in rather stable phase now."

Скажем-таки, ен забили, а кончилось финансирование... Кризис... Предложения MS от которого, как правило, не отказываются...

А язык, тьфу-тьфу, активно развивается и имеет стабильное комьюнити ;) Таки-да. Бу еще пилить и пилить до уровня...

anonymous
()
Ответ на: комментарий от tailgunner

> В общем случае - вряд ли :) И это уже не динамическая типизация, а смесь статики и динамики.

Так и скажи: "Я, питонщик, просто завидую SBCL." :-D

mv ★★★★★
()
Ответ на: комментарий от mv

> Так и скажи: "Я, питонщик, просто завидую SBCL." :-D

Пить-кушать не могу, да :(

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> насколько знаю оно все собралось на RSDNе :)

Ну тогда будущее языка в надежных руках, да.

tailgunner ★★★★★
()
Ответ на: комментарий от KRoN73

> с введением наследования некоторые языки, типа того же Перла, из теста выпадут :)

А вот не надо -- в перле множественное наследование есть (а также autoload методов, если тебе это что-то говорит).

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>А вот не надо -- в перле множественное наследование есть

Опаньки. Не знал :)

>а также autoload методов, если тебе это что-то говорит

Если это не то же самое, что __autoload в PHP (вызов системной функции при попытке обратиться к несуществующему классу. Соответственно, эта функция может загрузить класс как-то хитро. У меня это используется постоянно для обеспечения иерархии классов в файловой системе в духе Java), то не говорит.

...

Кстати, дурацкий вопрос - в каких языках (кроме Питона, в нём, насколько я знаю, это есть) можно в рантайме, при автозагрузке класса, дописать в этот класс дополнительные методы? Чтобы какие-то шаблонные методы вручную не писать, а генерировать по описанию. Имеется в виду готовое решение. А то можно и в Java класслоадер свой с байткодогенератором добавить, но для этого требуется дофига предварительной работы на низком уровне (JBForth 2 это будет уметь, но х.з., когда я до него доберусь). А вот готовые решения такие интересуют.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

>Mono/Boo/.NET/Java, а также всё на них основанное - говно. Python - это хорошо.

Java ну никак не говно. Я бы даже сказал:

Mono/Boo/.NET, а также все основанное и поддерживаемое компанией из редмонда - говно, Python, Java - это хорошо

obraztsov
()
Ответ на: комментарий от anonymous

>Анонимус безумно рад! То моно 2.0 вышел, теперь и Boo 0.9 вообще сказка!!! Видать недавний китайский новый год на них так повлиял, и теперь все идет по фен-шую!

Китайцы перед новым годом из своих домов злых духов выгоняют - вот и ползут они во все стороны: сначала SCO воскресло, теперь вот моно 2.0, moonlight, Boo, Kde4, windows 7 beta :)

obraztsov
()
Ответ на: комментарий от obraztsov

>Mono/Boo/.NET, а также все основанное и поддерживаемое компанией из редмонда - говно, Python, Java - это хорошо

http://ru.wikipedia.org/wiki/Говно

Там нет почему-то ни одного из перечисленных выше продуктов. И по определению не вписывается.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

> В интерпретаторе ясно - ошибку выдаст, а в скомпилированной проге ?

Не скомпилируется. ТАм где ты попытаешься вызвать инферер проверит чтобы для аргумента который ты пытаешься вызвать функция была определена.

r ★★★★★
()
Ответ на: комментарий от KRoN73

>http://ru.wikipedia.org/wiki/Говно >Там нет почему-то ни одного из перечисленных выше продуктов. И по >определению не вписывается.

Ну как же не вписываются?... Вот в жедудок кладется разная пища, а получается - одно.

Вот и с этим тоже. C#, например: взяли C++, Java, и пр., да ObjectPascal туда же, все это переварилось и вышло... ну что вышло то вышло.

anonymous
()
Ответ на: комментарий от mv

Ой-вей, лиспари в своем классическом проявлении.

> Да ладно, просто ты на лиспе писал в сишном стиле ;)


Унифицированный ответ на справедливые претензии. Разумеется, когда тебе убедительно доказали, что Лисп - беспомощный кусок говна, то проще всего ответить "Your code is not lispy at all. It's a crap" и свалить все на оппонента. Так покажите же труЪ-LISP решение, не стесняйтесь.

> Так и скажи: "Я, питонщик, просто завидую SBCL." :-D


"А кто меня не любит - вы просто мне завидуете." (С)
Универсальный же ответ на тот случай, когда аргументов по существу нет.

Разумеется, завидуем.

"лучшему на свете IDE" в виде унылой консольки без комплишенов, хистори и редактирования (REPL) - завидуем.
"самому легкопонимаемому коду", который представляет собой жуткое месиво из овсянки и обрезков ногтей - завидуем черной завистью. Хотя, ах, конечно же, это называется "язык, в котором отсутствует синтаксис, а семантику ты определяешь сам".
Оверхеду по памяти и CPU - завидуем люто, бешено, яростно.
Несовместимости диалектов - завидуем, аж зубы стерли. Ойлоло, вендоры LISP до сих пор не могут договориться о такой примитивной вещи, как передача в прогармму параметров командной строки (!!!)

Отвечать не по существу, универсальными демагогическими репликами - это Ваш стиль. Это подтверждает, что специалистом по LISP Вы не являетесь, и имеете к Лисп поверхностное отношение. (Если я неправ - докажите это.)

Так почему же Вы так яростно его адвокатируете? Сдается мне, здесь находит выход Ваш юношеский нонконформизм. В таком случае Ваше увлечение Лисп ничуть не лучше приснопамятной макофилии.

Спасибо.

anonymous
()
Ответ на: комментарий от tailgunner

>А алгоритм Хиндли-Милнера учитывает delattr? O_o

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

Например

dynamic class WebService {.....}
x = new WebService("url://to?wsdl");
x.webMethod();

Все равно дяже если это сгенерировать так как это делается сейчас - статической генерацией с WSDL перед компиляцией в рантайме столкнется с теми же граблями, если апи поменялось, что и динамика.

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

r ★★★★★
()
Ответ на: комментарий от anonymous

>Вот и с этим тоже. C#, например: взяли C++, Java, и пр., да ObjectPascal туда же, все это переварилось и вышло... ну что вышло то вышло.

И что выступало в роли желудка? У какого организма? Чем обычно питается этот организм? Что обычно имеет в отходах?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>И что выступало в роли желудка? У какого организма? Чем обычно питается этот организм? Что обычно имеет в отходах?

Переходим на анатомию? История появления С# всем давно известна, как и личность его создателя. Вообще не понимаю, зачем нужен язык, который: синтаксически напоминает яву (но никогда не станет похож на яву по идеологии, и тем более никогда не будет лучше явы), а по факту основан на скрешивании С++ с ObjectPascal с введением кучи ненужных никому фич, которые способствуют разве что ненужному усложнению и раздуванию языка. Даже С++ приятнее чем C#. Теперь вот той же процедуре подвергается и python. Зачем?

obraztsov
()
Ответ на: комментарий от obraztsov

Комменты лоровских аналитиков, как всегда полны аргуменов =/

theos ★★★
()
Ответ на: комментарий от r

>Все равно дяже если это сгенерировать так как это делается сейчас - статической генерацией с WSDL перед компиляцией в рантайме столкнется с теми же граблями, если апи поменялось, что и динамика. То есть язык будет статический, но с возможностью хэндлинга несуществующих символов и опциональных динамических типов.

???

А толку хэндлить несуществующие символы? Все равно мы во время написания исходника их не знаем, и употребить не можем.

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

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от KRoN73

>Если это не то же самое, что __autoload в PHP (вызов системной функции при попытке обратиться к несуществующему классу. Соответственно, эта функция может загрузить класс как-то хитро. У меня это используется постоянно для обеспечения иерархии классов в файловой системе в духе Java), то не говорит. Кстати, дурацкий вопрос - в каких языках (кроме Питона, в нём, насколько я знаю, это есть) можно в рантайме, при автозагрузке класса, дописать в этот класс дополнительные методы?

В перле autoload именно методов (насчет целых классов -- вроде как нет этого, но могу ошибиться) и + к этому можно добавить свои методы в предок всех-всех классов.

Насчет автозагрузки классов -- полагаю это кактус, вот недавно wfrr жаловался на то, что у него 2 класслоадера и из-за этого трудности с изготовлением синглтона. По-моему единственно правильный варинат -- метапрограммирование времени компиляции.

www_linux_org_ru ★★★★★
()

Столько языков, столько языков...

А вот хоть один проект на этом боо реализован? или оно чисто так ... для себя и поржать? mono и .net неодобряю, ибо чую ересь.

anonymous
()

Не хочу трамвай. Он мне не нужен. Я ведь пошутил =(

anonymous
()
Ответ на: комментарий от anonymous

> Ой-вей, лиспари в своем классическом проявлении.

Ты ваще не в теме, я даже комментировать не буду.

mv ★★★★★
()
Ответ на: комментарий от KRoN73

>Кстати, дурацкий вопрос - в каких языках (кроме Питона, в нём, насколько я знаю, это есть) можно в рантайме, при автозагрузке класса, дописать в этот класс дополнительные методы? Чтобы какие-то шаблонные методы вручную не писать, а генерировать по описанию. Имеется в виду готовое решение. А то можно и в Java класслоадер свой с байткодогенератором добавить, но для этого требуется дофига предварительной работы на низком уровне

groovy?

String.metaClass.truncate = {int length ->
def truncated = delegate;
if (truncated != null && truncated.length() > length)
truncated = truncated.substring(0, length - 3) + "...";
return truncated;
}

или
String.metaClass.methodMissing = {String methodName, args ->
...
}

thevery ★★★★
()
Ответ на: комментарий от KRoN73

Организьм - MS, он же - желудок.
Питается спиз^W найденными идеями и людьми.
В отходах - вантузофаги.

anonymous
()
Ответ на: комментарий от anonymous

Сдаётся мне, вы просто не видели хорошей статической типизации, если предлагаете взять Жабу.

anonymous
()
Ответ на: комментарий от cab

А теперь сводная F# vs Boo:
для Воо .Net - 5 сек., для Mono/Windows - 33 сек., Mono/Linux - 11сек.
для F# .Net - 4 сек., для Mono/Windows - 35 сек., Mono/Linux - 11 сек.

Стоит отметить более быструю компиляцию Воо.

cab ★★★★
() автор топика
Ответ на: комментарий от KRoN73

> А то можно и в Java класслоадер свой с байткодогенератором добавить, но для этого требуется дофига предварительной работы на низком уровне (JBForth 2 это будет уметь, но х.з., когда я до него доберусь). А вот готовые решения такие интересуют.

В Java 6 при использовании tools.jar это делается на раз. Мой java forth спокойненько генерирует жабские классы на лету.

Darkman ★★★
()
Ответ на: комментарий от anonymous

Меньше пены.

Emacs + Slime прекрасно работают как IDE. Насчет оверхеда - тоже гон, есть компиляторы, превосходящие по скорости фортран. Насчет несовместимости - вранье, есть стандарт, а его поддержка на совести разработчика компилятора.

И вообще, если хотите обосрать лисп, берите во внимание все-таки коммерческие реализации.

Sun-ch
()
Ответ на: комментарий от KRoN73

> можно в рантайме, при автозагрузке класса, дописать в этот класс дополнительные методы? Чтобы какие-то шаблонные методы вручную не писать, а генерировать по описанию. Имеется в виду готовое решение.

AOP/ AspectJ ?

anonymous
()
Ответ на: комментарий от KRoN73

>Кстати, дурацкий вопрос - в каких языках (кроме Питона, в нём, насколько я знаю, это есть) можно в рантайме, при автозагрузке класса, дописать в этот класс дополнительные методы?

http://strategoxt.org/Stratego/TheDryadCompiler#The_Java_bytecode_Language

anonymous
()
Ответ на: комментарий от KRoN73

> Куда копать?

Вот полная реализация:

public class ByteArrayStore extends SimpleJavaFileObject
{
    ByteArrayOutputStream stream = null;

    public ByteArrayStore (String className, Kind kind) throws URISyntaxException
    {
        super (new URI (className), kind);
    }

    public InputStream openInputStream ()
    {
        return new ByteArrayInputStream (stream.toByteArray ());
    }

    public OutputStream openOutputStream ()
    {
        return stream = new ByteArrayOutputStream ();
    }

    public byte[] getByteArray ()
    {
        return stream.toByteArray ();
    }
}

public class ByteClassLoader extends ClassLoader
{
    Map <String, JavaFileObject> store = null;

    public ByteClassLoader (Map<String, JavaFileObject> store)
    {
        super (ByteClassLoader.class.getClassLoader ());
        this.store = store;
    }

    public Class<?> findClass (String name) throws ClassNotFoundException
    {
        JavaFileObject jfo = store.get (name);
        if (jfo == null) throw new ClassNotFoundException (name);
        byte[] bytes = ((ByteArrayStore)jfo).getByteArray ();
        Class c = defineClass (name, bytes, 0, bytes.length);
        if (c == null) throw new ClassNotFoundException (name);
        return c;
    }
}

public class ByteJavaFileManager<M extends JavaFileManager> extends ForwardingJavaFileManager<M>
{
    Map<String,JavaFileObject> store = null;

    public ByteJavaFileManager (M filemanager, Map<String, JavaFileObject> store)
    {
        super (filemanager);
        this.store = store;
    }

    public JavaFileObject getJavaFileForOutput (Location location,
                                                String className,
                                                JavaFileObject.Kind kind,
                                                FileObject sibling) throws IOException
    {
        try
        {
            JavaFileObject jfo = new ByteArrayStore (className, kind);
            store.put (className, jfo);
            return jfo;
        }
        catch (Exception e)
        {
                throw new IOException ("JFO error");
        }
    }
}

public class CodeString extends SimpleJavaFileObject
{
    String source = null;

    public CodeString (String uri, String source) throws URISyntaxException
    {
        super (new URI(uri), Kind.SOURCE);
        this.source = source;
    }

    public CharSequence getCharContent (boolean ignoreEncodingErrors)
    {
        return source;
    }
}

public class ForthCompileJavaClass extends AbstractOperator
{
    protected void real_call () throws Exception
    {
        String name = (String) GetAStackObject (String.class);
        String code = (String) GetAStackObject (String.class);
        vm.CompileJavaClass (name, code);
    }
}

public class ForthLoadJavaClass extends AbstractOperator
{
    protected void real_call () throws Exception
    {
        String name = (String) GetAStackObject (String.class);
        astack.push (new AStackMember (vm.LoadCompiledJavaClass (name)));
    }
}

public class JavaClassFromStringCompiler
{
    JavaCompiler compiler = null;
    HashMap<String, JavaFileObject> byte_store;
    StandardJavaFileManager filemanager;
    DiagnosticCollector<JavaFileObject> diags;
    ByteJavaFileManager<StandardJavaFileManager> jfm;

    public JavaClassFromStringCompiler () throws JavaCompilerNotFound
    {
        compiler = ToolProvider.getSystemJavaCompiler ();
        if (compiler == null) throw new JavaCompilerNotFound ();
        byte_store = new HashMap<String, JavaFileObject> ();
        filemanager = compiler.getStandardFileManager (diags,null,null);
        diags = new DiagnosticCollector<JavaFileObject> ();
        jfm = new ByteJavaFileManager<StandardJavaFileManager> (filemanager, byte_store);
    }

    public void CompileClass (String className, String code) throws URISyntaxException
    {
        CodeString cs = new CodeString (className + ".java", code);
        ArrayList<String> options = new ArrayList<String> ();
        options.add ("-classpath");
        options.add ("/opt/sun-jdk-1.6.0.06/jre/lib/resources.jar:/opt/sun-jdk-1.6.0.06/jre/lib/man
agement-agent.jar:/opt/sun-jdk-1.6.0.06/jre/lib/jce.jar:/opt/sun-jdk-1.6.0.06/jr
e/lib/rt.jar:/opt/sun-jdk-1.6.0.06/jre/lib/jsse.jar:/opt/sun-jdk-1.6.0.06/jre/li
b/charsets.jar:/opt/sun-jdk-1.6.0.06/jre/lib/ext/dnsns.jar:/opt/sun-jdk-1.6.0.06
/jre/lib/ext/sunpkcs11.jar:/opt/sun-jdk-1.6.0.06/jre/lib/ext/sunjce_provider.jar
:/opt/sun-jdk-1.6.0.06/jre/lib/ext/localedata.jar:/home/darkman/Projects/BFCD4/o
ut/production/BFCD4:/opt/sources/Java/qtjambi-linux64-gpl-4.4.0_01/qtjambi-4.4.0
_01.jar:/opt/sources/Java/qtjambi-linux64-gpl-4.4.0_01/qtjambi-linux64-gcc-4.4.0
_01.jar:/opt/sources/Java/qtjambi-linux64-gpl-4.4.0_01");
        JavaCompiler.CompilationTask task = compiler.getTask (null,jfm,diags,options,null,
                                                              Arrays.asList (cs));
        task.call ();
        for (Diagnostic d : diags.getDiagnostics())
            System.out.println(d);
    }

    public Class LoadClass (String className) throws ClassNotFoundException
    {
        ByteClassLoader loader = new ByteClassLoader (byte_store);
        Class<?> c = loader.loadClass (className);
        return c;
    }
}

Darkman ★★★
()
Ответ на: комментарий от www_linux_org_ru

>А толку хэндлить несуществующие символы? Все равно мы во время написания исходника их не знаем, и употребить не можем.

Можем - просто тип строится в рантайме. Такая техника в нормальной динамике используется для вебсервисов, аналогах актив рекорд руби (то есть структуры строятся из метаданных базы), и тому подобных вещах.

r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.