LINUX.ORG.RU

загадка

 , , ,


0

1

раз в Develop пошла такая пьянка с lisp`ами и прочей функциональщиной..

УГАДАЙ ЯЗЫК

по коду

set number 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
set a [ range 1 $number ]
set r [ reverse $a ]
set rr [ reverse $r ]
puts [ join [ tail 5 $r ] \n ]
puts [ join [ tail 5 $rr ] \n ]
puts [ time {
        reverse [ reverse [ range 1 $number ] ]
} 1000 ]
и выхлопу
5
4
3
2
1
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5456.934 microseconds per iteration
микросекунды замерены на Intel(R) Atom(TM) CPU N270 @ 1.60GHz

microseconds per iteration

С таким спойлером трудно не угадать

Код выглядит так себе. Для неподготовленного человека слегка похоже на шелл, но как-то еще непонятнее

anonymous ()

единственный известный мне язык, в котором так расставляются квадратные скобки - фактор

anonymous ()

tcl. пренайприятнейший язык.

P.S. styleguide бы вам, сударь.

anonymous ()

На вижуал бейсик не похоже... Алгол?:-)

AIv ★★★★★ ()

какой-то DSL, написанный на MPS. Соответственно язык - Java. :-)

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

он лучше, чем шелл (posix, а то бывают и другие, более адекватные) уже хотя бы тем, что он парсится в один проход, то подстановки переменных, поэтому нет никакой головной боли с квотированием аргументов (т.е. [f $a] это всегда вызов функции f с одним аргументом $a, а не в зависимости от того, что в a лежит)

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

А ты правда кроме жабы ни о чём думать не можешь? :-)

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

Конечно не могу! У меня анальная фиксация. Спроси Фрейда. В периоды ремиссии могу думать о scala, clojure и MPS, они тоже жаба :-)

stevejobs ★★★★☆ ()

Что-то тиклеобразное, вроде Brush или Cloverfield

buddhist ★★★★★ ()

Ответ от ТС-а-то будет?

ashot ★★★ ()

да tcl это, ТСов любимый. Что непонятно? С его функциональной либой.

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

Спроси Фрейда

(в тред тихо входит дух Фрейда)

У меня анальная фиксация

Не нужно стесняться этого. Расслабьтесь, сядьте поудобнее и расскажите какие ассоциации у вас вызывает слово «ява»

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

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

ув. anonymous высказавшийся сразу после вас, угадал на 100%. Это тикль, с самодельным довеском. Просто днясь переделал полностью упомянутую либу, чтоб умела всякие ленивые списки и всякие Y комбинаторы. А тут вдруг такой всплеск интереса к функциональщине :-)

Один предлагает делать лисп в 1000строк (преувеличивает и привирает ради объёма книги), другой зазывает помошников на изготовление супер лиспа. И так далее..

пример просто показывает, что в Tcl возможны ленивые списки и быстрые операции над ними. Для ruby насколько слышал (не знаю руби, всё как-то руки не доходят) инверсия списка от 1 до 10^10 смертельный номер, а уж тем более вские map/filter с ним. В Наскел и лисп это возможно, вот втаскиваю фичу в тикль :-) Осталось код прокоментить и мин.док. сделать.

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

пример просто показывает, что в Tcl возможны ленивые списки и быстрые операции над ними.

В Tcl не хватает быстрого компилятора и call/cc. Всё остальное там есть.

Для ruby насколько слышал (не знаю руби, всё как-то руки не доходят) инверсия списка от 1 до 10^10 смертельный номер

Если также как у тебя сделать класс range, то всё будет практически также. Ну может чуть медленнее (ruby вообще не скоростной).

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

Если также как у тебя сделать класс range

а я не делал класс range :-) не мудрствуя лукаво взял кортежи из lisp и ему подобных..поэтому собственно и имею основания говорить, что lisp это просто..

range это вообще функция, сделанная почти на коленке, чтобы генерировать входы для отладки map/filter/reverse

proc range { min max } {
	if { $min>$max } {
		return -code error -errorInfo "\"min\" should lesser then \"max\" "
	}
	set delta [ expr $max - $min ]
	if { $delta == 0 } {
		return [ tuple $min ]
	} elseif { $delta == 1 } {
		return [ tuple $min $max ]
	} elseif { $delta == 2 } {
		return [ tuple $min [ expr $min + 1 ] $max ]
	} elseif { $delta == 3 } {
		return [ tuple $min [ expr $min + 1 ] [ expr $max - 1 ] $max ]
	} elseif { $delta < 10 } {
		return [ tuple $min [ lazy range [ expr $min + 1 ] [ expr $max - 1 ] ] $max ]
	} else {
		set median [ expr $min + $delta / 2 ]
		return [ tuple $min [ lazy range [ expr $min + 1 ] $median ] [ lazy range [ expr $median + 1 ] [ expr $max - 1 ] ] $max ] 
	}
}

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

Для ruby насколько слышал (не знаю руби, всё как-то руки не доходят) инверсия списка от 1 до 10^10 смертельный номер, а уж тем более вские map/ filter с ним.

Разве в руби нет итераторов? Сомневаюсь.

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

range это вообще функция, сделанная почти на коленке

А tail у тебя тоже самописная?

а я не делал класс range

Если что-то должно работать как List, то оно должно реализовать все методы List и являться его наследником (с точки зрения динамических языков его должно быть можно подставить во все функции, работающие со списками). Иначе пользы будет мало.

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

пример просто показывает, что в Tcl возможны ленивые списки и быстрые операции над ними.

Ленивые списки и карринг возможны даже в с++, чоужтам (http://www.boost.org/doc/libs/1_57_0/libs/phoenix/doc/html/index.html). Это не оправдание существования тикля.

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

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

оно никому ничего не должно :-) Tcl так устроен, что это что-то должно сериализоваться в List (точнее в текст пригодный для List) и ничего более. К тому-же злаполучный List в Tcl является простым массивом и чтобы получить профит от ленивых операций, пришлось делать List-как-список-как-в-lisp`е.

Получается эдакий забавный lisp внутри Tcl :-) сижу вот, забавляюсь - очень прикольно

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