Здравствуйте, thesz, Вы писали:
T>Читайте про DCG.
Читайте.
T>Как мне это надоело.
Надеюсь, никто с паяльником не стоит над душой?
T>Как и во всём другом.
Зато как мне приятно тратить ваше время.
T>Комбинация сложных систем из простых на одних языках проще, чем на других. Поэтому здесь важно всё.
Да ладно, всё. Потрудитесь в конце концов изучить то, о чём неумело пытаетесь спорить.
T>Важно, как собирается сложная система и чем может помочь компилятор в плане скорости ее выполнения.
Хе-хе, собирается, стало быть.
T>Есть. "Внимательней вглядись" (С) Басё
Нет. Хотя, конечно, если долго всматриваться в бездну, то и бездна начинает всматриваться в тебя. (с) Ницше.
T>Не содержится.
Содержится.
Здравствуйте, 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>Похоже умирает на лишнем пустой строчке
Эээ, сами поправите?
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)
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?
X>>>Сдается, товарищи выше имели в виду что-то более конкретное... T>>Именно. T>>Я имел в виду функции высших порядков. T>>Твой самый первый пример выражен в самом конце. X>Я правильно понял, что в функция высшего порядка это pmany?
pmany, pmany1, bracketed, braced, sqbracketed.
X>Тогда можно как-то так сообразить: 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 секунды.
Здравствуйте, thesz, Вы писали:
T>Это я понял.
T>И какая у этого производительность?
T>Если переписать те же digits через pmany, что получится, какая скорость?
Здравствуйте, Аноним, Вы писали:
А>Скорее тривиален. А>
А>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);
}
}
}
Весной для Сапки делал на Окамле классические парсер-комбинаторы на списках, на обуждаемой тут задачке про даблы сам разбор получился 23 МБ/с (на 2.33 GHz), но это если не учитывать перевод строки в список. А если учитывать, то только 7.8 МБ/с.
На днях попробовал в качестве proof of concept сделать оптимизирующие парсер-комбинаторы. Получилось не так элегантно, зато шустро — 35 МБ/с, т.е. на машине топикстартера можно ожидать 46 МБ/с — чуть быстрее Спирита. И при такой скорости никакой кодогенерации не используется, парсер создается динамически, как обычно воспроизводя грамматику.
Подробности про оба тут: http://thedeemon.livejournal.com/1155.html#cutid1