Re[11]: Мой вариант на прологе
От: Аноним  
Дата: 30.05.09 12:55
Оценка:
Здравствуйте, thesz, Вы писали:

T>Читайте про DCG.

Читайте.

T>Как мне это надоело.

Надеюсь, никто с паяльником не стоит над душой?

T>Как и во всём другом.

Зато как мне приятно тратить ваше время.

T>Комбинация сложных систем из простых на одних языках проще, чем на других. Поэтому здесь важно всё.

Да ладно, всё. Потрудитесь в конце концов изучить то, о чём неумело пытаетесь спорить.

T>Важно, как собирается сложная система и чем может помочь компилятор в плане скорости ее выполнения.

Хе-хе, собирается, стало быть.

T>Есть. "Внимательней вглядись" (С) Басё

Нет. Хотя, конечно, если долго всматриваться в бездну, то и бездна начинает всматриваться в тебя. (с) Ницше.

T>Не содержится.

Содержится.
Re[11]: Мой вариант на прологе
От: xonixx  
Дата: 30.05.09 13:00
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Здравствуйте, xonixx, Вы писали:


X>>типа такого http://xonix.habrahabr.ru/blog/50693/ ?


DM>Нет, совсем другое. Речь про аналог try/finally.


можно пример или ссылочку?
Re[7]: Мой вариант на прологе
От: Аноним  
Дата: 30.05.09 13:09
Оценка:
Здравствуйте, FR, Вы писали:

FR>Теперь


FR>Unhandled Exception: System.FormatException: Input string was not in a correct format.

FR> at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
FR> at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
FR> at System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info)
FR> at MainApp.<Main>b__0(String value)
FR> at System.Array.ConvertAll[TInput,TOutput](TInput[] array, Converter`2 converter)
FR> at MainApp.Main()

FR>Похоже умирает на лишнем пустой строчке

Эээ, сами поправите?
Re[12]: Мой вариант на прологе
От: FR  
Дата: 30.05.09 13:14
Оценка:
Здравствуйте, xonixx, Вы писали:


DM>>Нет, совсем другое. Речь про аналог try/finally.


X>можно пример или ссылочку?


http://www.gnu.org/software/emacs/elisp/html_node/Cleanups.html
Re[8]: Мой вариант на прологе
От: FR  
Дата: 30.05.09 13:14
Оценка: +1 :)))
Здравствуйте, Аноним, Вы писали:

FR>>Похоже умирает на лишнем пустой строчке

А>Эээ, сами поправите?

Не мне удобнее считать что шарп сливает
Re[13]: Мой вариант на прологе
От: xonixx  
Дата: 30.05.09 13:49
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, xonixx, Вы писали:



DM>>>Нет, совсем другое. Речь про аналог try/finally.


X>>можно пример или ссылочку?


FR>http://www.gnu.org/software/emacs/elisp/html_node/Cleanups.html


Ну в прологе (по крайней мере, в SWI) тоже есть исключения

 ?- catch((writeln('Test1...'),
|    throw(exc('Ups..')),
|    writeln('Unachievable..')), exc(E), writeln(E)).
Test1...
Ups..
E = 'Ups..'.


Сдается, товарищи выше имели в виду что-то более конкретное...
Re[14]: Мой вариант на прологе
От: thesz Россия http://thesz.livejournal.com
Дата: 30.05.09 14:14
Оценка:
DM>>>>Нет, совсем другое. Речь про аналог try/finally.
X>>>можно пример или ссылочку?
FR>>http://www.gnu.org/software/emacs/elisp/html_node/Cleanups.html
X>Ну в прологе (по крайней мере, в SWI) тоже есть исключения
X>
X> ?- catch((writeln('Test1...'),
X>|    throw(exc('Ups..')),
X>|    writeln('Unachievable..')), exc(E), writeln(E)).
X>Test1...
X>Ups..
X>E = 'Ups..'.
X>


X>Сдается, товарищи выше имели в виду что-то более конкретное...


Именно.

Я имел в виду функции высших порядков.

import Control.Monad.State
import Control.Monad.List

type P a = StateT String [] a

pitem :: P Char
pitem = do
    cs <- get
    case cs of
        (c:cs) -> do
            put cs
            return c
        _ -> mzero

psat p = do
    x <- pitem
    if p x then return x else mzero

pchar c = psat (==c)

pmany p = pmany1 p `mplus` return []
pmany1 p = do
    x <- p
    xs <- pmany p
    return $ x:xs

bracketed open close action = do
    open
    x <- action
    close
    return x

braced = bracketed (pchar '(') (pchar ')')

balanced = do {pmany (braced balanced); return ()}


Твой самый первый пример выражен в самом конце.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[14]: Мой вариант на прологе
От: FR  
Дата: 30.05.09 14:37
Оценка:
Здравствуйте, xonixx, Вы писали:

X>Сдается, товарищи выше имели в виду что-то более конкретное...


Имелось в виду что эти "исключения" делются штатными средствами языка.
Re[15]: Мой вариант на прологе
От: xonixx  
Дата: 30.05.09 14:46
Оценка:
X>>Сдается, товарищи выше имели в виду что-то более конкретное...

T>Именно.


T>Я имел в виду функции высших порядков.


T>
T>import Control.Monad.State
T>import Control.Monad.List

T>type P a = StateT String [] a

T>pitem :: P Char
T>pitem = do
T>    cs <- get
T>    case cs of
T>        (c:cs) -> do
T>            put cs
T>            return c
T>        _ -> mzero

T>psat p = do
T>    x <- pitem
T>    if p x then return x else mzero

T>pchar c = psat (==c)

T>pmany p = pmany1 p `mplus` return []
T>pmany1 p = do
T>    x <- p
T>    xs <- pmany p
T>    return $ x:xs

T>bracketed open close action = do
T>    open
T>    x <- action
T>    close
T>    return x

T>braced = bracketed (pchar '(') (pchar ')')

T>balanced = do {pmany (braced balanced); return ()}
T>


T>Твой самый первый пример выражен в самом конце.


Я правильно понял, что в функция высшего порядка это pmany?

Тогда можно как-то так сообразить:

many(What) -->
    What,
    many(What).
many(_) --> [].

bracketed(Open, Close, What) -->
    Open,
    What,
    Close.

braced(What) --> bracketed("(", ")", What).
braced(What) --> bracketed("{", "}", What).
braced(What) --> bracketed("[", "]", What).

balanced -->
    many(braced(balanced)).

test :-
    phrase(balanced, "[](){[{()}]}"),
    phrase(balanced, "[[[()]]]({}{{[]}})[{}]()[]"),
    \+ phrase(balanced, "[[[()]]]({[}{{[]}})[{}]()[]").



?- test.
true .
Re[16]: Мой вариант на прологе
От: thesz Россия http://thesz.livejournal.com
Дата: 30.05.09 20:33
Оценка:
X>>>Сдается, товарищи выше имели в виду что-то более конкретное...
T>>Именно.
T>>Я имел в виду функции высших порядков.
T>>Твой самый первый пример выражен в самом конце.
X>Я правильно понял, что в функция высшего порядка это pmany?

pmany, pmany1, bracketed, braced, sqbracketed.

X>Тогда можно как-то так сообразить:

X>
X>...
X>test :-
X>    phrase(balanced, "[](){[{()}]}"),
X>    phrase(balanced, "[[[()]]]({}{{[]}})[{}]()[]"),
X>    \+ phrase(balanced, "[[[()]]]({[}{{[]}})[{}]()[]").
X>


Это я понял.

И какая у этого производительность?

Если переписать те же digits через pmany, что получится, какая скорость?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[9]: Мой вариант на прологе
От: Аноним  
Дата: 31.05.09 05:33
Оценка:
Здравствуйте, FR, Вы писали:

FR>Не мне удобнее считать что шарп сливает

Не вам? А кому удобнее считать?
Re[5]: Мой вариант на прологе
От: Аноним  
Дата: 31.05.09 07:17
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Аноним, Вы писали:


А>>А где скорость работы?


FR>Так шустрее большинства тут

Проверил на IronPython, следующий код

from System.Diagnostics import Stopwatch

s = Stopwatch()
s.Start()

print sum((float(value.replace(',','.')) for value in open("c:\\numbers_large.txt").read().split(" ") if value))

s.Stop()

print s.ElapsedMilliseconds


На Q6600 отработал за 24 секунды
Аналог на C# отработал за 4 секунды.
Re[6]: Мой вариант на прологе
От: FR  
Дата: 31.05.09 13:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>На Q6600 отработал за 24 секунды

А>Аналог на C# отработал за 4 секунды.

Аналог на C# засекречен?
Re[10]: Мой вариант на прологе
От: FR  
Дата: 31.05.09 13:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, FR, Вы писали:


FR>>Не мне удобнее считать что шарп сливает

А>Не вам? А кому удобнее считать?

У меня запятая на клавиатуре сломалась
Re[17]: Мой вариант на прологе
От: xonixx  
Дата: 31.05.09 21:50
Оценка:
Здравствуйте, thesz, Вы писали:

T>Это я понял.


T>И какая у этого производительность?


T>Если переписать те же digits через pmany, что получится, какая скорость?


переписал так:

:- set_prolog_flag(float_format,'%.15g').

many1(What, [H | T]) -->
    call(What, H), !,
    many1(What, T).
many1(_, []) --> [].


integer(I) -->
        many1(digit, [D|DD]),
    { number_chars(I, [D|DD])
        }.

digit(D) -->
        [D],
        { code_type(D, digit)
        }.


float(F) -->
    (   "-", {Sign = -1}
    ;   "", {Sign = 1}
    ), !,
    integer(N),
    ",",
    integer(D),
    {F is Sign * (N + D / 10^(ceiling(log10(D))))
    }.

sum(S, Total) -->
    float(F1), !,
    " ",
    { S1 is S + F1},
    sum(S1, Total).
sum(Total, Total) -->
    [].

go1 :-
    phrase_from_file(sum(0, S),'numbers_large.txt', [buffer_size(16384)]),
    writeln(S).


да, скорость в легкую подупала (1мин 6 сек -> 1 мин 20 сек, вероятнее всего из-за использования call). Потребление памяти не изменилось.
prolog
Re[7]: Мой вариант на прологе
От: Аноним  
Дата: 02.06.09 15:54
Оценка:
Здравствуйте, FR, Вы писали:

FR>Аналог на C# засекречен?

Скорее тривиален.
Console.WriteLine((from value in File.ReadAllText(@"c:\numbers_large.txt").Split(' ') where value !=  "" select double.Parse(value)).Sum());
Re[8]: Мой вариант на прологе
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 02.06.09 17:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скорее тривиален.

А>
А>Console.WriteLine((from value in File.ReadAllText(@"c:\numbers_large.txt").Split(' ') where value !=  "" select double.Parse(value)).Sum());
А>


Сколько мегов в секунду, кстати?
Re[9]: Мой вариант на прологе
От: Аноним  
Дата: 02.06.09 18:20
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Сколько мегов в секунду, кстати?

25 mb/s на Q6600.

Split, понятно, тормозит.

Если заменить на такой:

public static class StringHelper
{
    public static IEnumerable<string> AsyncSplit(this string value, char delimiter)
    {
        int start = 0;
        int index = value.IndexOf(delimiter, start);

        while (index != -1)
        {
            yield return value.Substring(start, index - start);
            start = index + 1;
            index = value.IndexOf(delimiter, start);
        }
    }
}


то будет 33 mb/s.
Re[8]: Мой вариант на прологе
От: FR  
Дата: 03.06.09 05:33
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, FR, Вы писали:


FR>>Аналог на C# засекречен?

А>Скорее тривиален.
А>
А>Console.WriteLine((from value in File.ReadAllText(@"c:\numbers_large.txt").Split(' ') where value !=  "" select double.Parse(value)).Sum());
А>


Тык мы языкам необучены, спасибо что снизошли

Да в четыре раза шустрее питона, но корявей немного. В общем третий шарп уже достаточно выразителен.
Re: Haskell :: не такой тормоз, как кажется
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 04.06.09 07:02
Оценка: 5 (1)
Весной для Сапки делал на Окамле классические парсер-комбинаторы на списках, на обуждаемой тут задачке про даблы сам разбор получился 23 МБ/с (на 2.33 GHz), но это если не учитывать перевод строки в список. А если учитывать, то только 7.8 МБ/с.

На днях попробовал в качестве proof of concept сделать оптимизирующие парсер-комбинаторы. Получилось не так элегантно, зато шустро — 35 МБ/с, т.е. на машине топикстартера можно ожидать 46 МБ/с — чуть быстрее Спирита. И при такой скорости никакой кодогенерации не используется, парсер создается динамически, как обычно воспроизводя грамматику.
Подробности про оба тут:
http://thedeemon.livejournal.com/1155.html#cutid1
ocaml parsers
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.