РАдости, из бота, ставшей очаровательной собеседницей.
С каждым днём всё более любимого Эко старое интервью журналу, название которого как только у нас не переводят.
Цитата
Ли Маршалл. Предположим, вы используете компьютер для рождения вашего очередного романа; каковы будут ваши действия?
Умберто Эко. Я отвечу вам цитатой из собственного эссе, которое я недавно закончил для антологии Come si scrive un romanzo ("Как написать роман"),выходящей в издательстве Bompiani. "Я просканировал бы с сотню романов, не меньшее количество научных текстов. Библию, Коран, несколько телефонных справочников (в них содержится огромное количество имен собственных). Все вместе это составляет примерно миллион двести тысяч страниц. Потом я заложил бы какую-нибудь простую, случайно подвернувшуюся программу, чтобы все это смешать и произвести в этом меланже кое-какие изменения. Например, можно убрать оттуда все буквы А. Тогда у меня получился бы роман-липограмма. Следующий шаг -- вывести все это на принтер и внимательно прочесть несколько раз, выделяя наиболее важные пассажи. Потом погрузить продукт в трейлер и отвезти на ближайший мусоросжигающий завод. И, глядя, как все это горит синим пламенем, я сидел бы поддеревом с карандашом в руке, праздно размышляя, покуда в голову не придет пара строк, заслуживающая того, чтобы занести их на бумагу. Например: "Луна плывет высоко в небе -- лес шумит".На первый раз наш роман вряд ли сможет конкурировать с хайку. Но это не имеет значения. Главное -- начать.
Многие считают, что "ещё чуть - чуть" - сеть достигнет критической точки, и "поумнеет". Другие относятся к сети более прагматично, что ли? Взять, к примеру, прошлогодние заявления мистера О'Reilly . В частности, о том, что web это платформа. В самом деле, данных там с избытком, хоть и порядка никакого. Ну вот. Почему бы не использовать сеть как оракула уже сейчас, разумеется, не задавая слишком сложные вопросы. А там, глядишь, сеть и "поумнеет" (тогда и будем писать "Сеть" - с большой буквы). Хитрость в том, что очень часто, людям нужен не правильный ответ, а тот, который они ожидают. Для машины путь Умберто Э. неприемлем, конечно.
Задача такая: зарегистрироваться на google и скачать там api с помощью запросов на google, сочинить пару песенных куплетов. чтобы было веселей оформить всё это онегинской строфой.
Вот пояснения. По поводу api: http://www.google.com/apis/ http://groups.google.com/groups?hl=en&...public.web-apis Забавно, дистрибутив занимает 666кБ. Всё те же сотонинские шуточки Разумеется и без него можно обойтись. Но ведь предлагают... Как тут откажешься, ведь даром! Компания клепает новые сервисы - как пирожки печёт. Даже доменные имена под них не регистрирует. Пример: ~ google.com/musicsearch, но он не достаточно гибкий. Лучше взять классику.
По поводу песенок сочинения. Ну попса, ну cлов немного, рифмовка несложная. ... name ... fire ... way ....die
Чтобы не усложнять алгоритм - будем считать что строки рифмуются крест - накрест. Конечно, всякое может случится: певице - дуре придёт в голову многократно и грязно выругаться, песня может попасться сложной. Но, в конечном счёте, большинство держатся в канве: break-heart-make-hurt. От первой песни берём три строчки первого куплета и размазываем по всему сонету в качестве первых строк четверостиший. Остальные три строки в каждом стихе выцарапываются из сети.
Насчёт сонета по Пушкину:
Цитата
Она любила на балконе Предупреждать зари восход, Когда на бледном небосклоне Звезд исчезает хоровод,
И тихо край земли светлеет, И, вестник утра, ветер веет, И всходит постепенно день. Зимой, когда ночная тень
Полмиром доле обладает, И доле в праздной тишине, При отуманенной луне, Восток ленивый почивает,
В привычный час пробуждена Вставала при свечах она.
Т.е. четыре строки - перекрёстная рифмовка, затем четыре строки парной - 1-я со 2 - й, 3-я с 4-й; ещё четверостишие рифмуется так: 1 - 4, 2 -3. И последние две рифмующиеся строки. В них проблема. Будем брать их из припева самой первой stuff-песни, ну, или другой - чтобы поменьше на плагиат смахивало .
Всё. Достаточно формализована задача. Можно приступать.
Код
/********************************************************************* // 0 // 1 It's a simple artificial poet. // 2 A sample of working with xml in scala. // 3 // 4 Ну. Что тут скажешь. Продолжаем гнуть линию, начатую // 5 в прошлой теме. Постмодерн. // 6 // 7 Программа написана "от балды", развлечения ради, и // 8 проверки - насколько прочная платформа, этот веб. // 9 Никакой науки за ней не стоит. Только здравый смысл. // 10 Заключается он в том, что попса - проста, большинство // 11 песен - про любовь-морковь, т.е. семантически близки. // 12 Оно, конечно, было бы здорово, что - то серъёзнее замутить. // 13 Но, увы, ни знаний, ни времени нет. // 14 // 15 */ // 16 // 17 import scala.xml._; // 18 import java.util.regex.Pattern; // 19 import java.io._; // 20 // 21 object MParse // 22 { // 23 // 24 def main(args: Array[String])= // 25 { // 26 def test = // 27 { // 28 val file = new File("KORN LYRICS - Here It Comes Again.htm"); // 29 val buff = new Array[byte](file.length().asInstanceOf[int]); // 30 val is = new BufferedInputStream(new FileInputStream(file)); // 31 // 32 is.read(buff); // 33 var songFile = html_sucks__xhtml_rulez(new String(buff)); // 34 val doc = XML.load( new BufferedReader( // 35 new CharArrayReader(songFile.toCharArray()))); // 36 // 37 Console.println(fromAzLyrics_xpath(doc, "right")); // 38 Console.println(fromAzLyrics_inline(doc, "right")); // 39 Console.println(fromAzLyrics_native(doc, "right")); // 40 } // 41 test; // 42 // 43 // 44 // Ну чё там у нас сейчас ищут чаще всего в сети ? // 45 // Правильно, некую девицу по имени Breantey Spears // 46 // Поддержим традицию. // 47 // Чтобы не загромождать код, предположим, у нас есть // 48 // начальные фразы из эпохального "Ooops!... I did it again" // 49 // В качестве припева, т.е. двух последних строк - многократное yeah. // 50 // Разумеется, конечный продукт очень уж будет близок к песни // 51 // молодости нашей. Для более изощрённого варианта надо бы // 52 // алгоритм усложнять. Предполагается ограничение поиском на AzLyrics.com // 53 // 54 // ~ code ~ // 55 // 56 // var rythmWord = "it again" // 57 // val xhtml_source = html_sucks__xhtml_rulez(htmlFromGoogleFor(rythmWord) )// 58 // val doc = XML.load(new StringReader(xhtml_source)) // 59 // val rythm = fromAzLyrics_xpath(doc, rythmWord) // 60 // Console.println("Ooops!... I did it again") // 61 // Console.println(rythm) // 62 // различные вариации со строками, URLConnection, поиском в сети ... // 63 // .. // 64 // другие куплеты // 65 } // 66 // 67 def fromAzLyrics_xpath(node: Node, rythmWord: String): String = // 68 { // 69 var res: String = ""; // 70 // 71 for (val fBlock <- node \\ "font"; // 72 val fBlockInn <- fBlock \ "font") // 73 { // 74 // non - local return not yet implemented so ... // 75 res = rythm(fBlockInn.text, rythmWord); // 76 } // 77 res; // 78 } // 79 // 80 def fromAzLyrics_inline(node: Node, rythmWord: String): String = // 81 { // 82 var res: String = ""; // 83 var nonstop: boolean = true; // 84 // 85 node match // 86 { // 87 case <font>{childs @ _*}</font> // 88 => rythm(node.text, rythmWord); // 89 // 90 case _ // 91 => val childIter = node.child.elements; // со стандартными библиотеками // 92 while(nonstop && childIter.hasNext) // ещё не навострился :) работать // 93 { // 94 res = fromAzLyrics_inline(childIter.next, rythmWord); // 95 if (res != "") nonstop = false; // 96 } // 97 res; // 98 } // 99 } // 100 // 101 def fromAzLyrics_native(node: Node, rythmWord: String): String = // 102 { // 103 var res: String = ""; // 104 var nonstop: boolean = true; // 105 // 106 node match // 107 { // 108 case Elem(_, "font", _, _, childs @ _*) // 109 => return rythm(node.text, rythmWord); // 110 // 111 case _ // 112 => val childIter = node.child.elements; // 113 while(nonstop && childIter.hasNext) // 114 { // 115 res = fromAzLyrics_native(childIter.next, rythmWord); // 116 if (res != "") nonstop = false; // 117 } // 118 res; // 119 } // 120 } // 121 // 122 /** // 123 Никакая это, конечно, не рифма, но сойдёт. // 124 */ // 125 def rythm(stuff: String, rythmWord: String): String = // 126 { // 127 val text = stuff.split("\n"); // 128 var res = ""; // 129 for (val str <- text; // 130 str.indexOf(rythmWord) > -1) // 131 { // 132 res = str; // 133 } // 134 res; // 135 } // 136 // 137 def firstHtmlFromGoogle(keyWord: String): String = // 138 { // 139 "";//смотри google api, я для поиска брал keyWord + " site:AzLyrics.com" // 140 } // 141 // 142 /** // 143 Ничего страшного. Просто вправляем результат // 144 чьей - то наследственной криворукости. // 145 */ // 146 def html_sucks__xhtml_rulez(html_source: String): String = // 147 { // 148 // По идее, строку // 19 можно было бы сюда перенести, вот так: // 149 // import java.util.regex.Pattern; // 150 val META_PTRN = // 151 Pattern.compile("<META.*>", Pattern.CASE_INSENSITIVE); // 152 val BR_PTRN = // 153 Pattern.compile("<BR>", Pattern.CASE_INSENSITIVE); // 154 val ATTR_PTRN = // 155 Pattern.compile("=\\s*#?[\\w\\d]+%?", Pattern.CASE_INSENSITIVE); // 156 // 157 var matcher = BR_PTRN.matcher(html_source); // 158 var source = matcher.replaceAll("<br/>"); // 159 // 160 matcher = META_PTRN.matcher(source); // 161 source = matcher.replaceAll("<meta comm='html - sucks, xhtml - rulez'/>"); // 162 // 163 matcher = ATTR_PTRN.matcher(source); // 164 if (matcher.find()) // 165 { // 166 source = matcher.replaceAll("='html - sucks, xhtml - rulez' "); // 167 } // 168 source.toLowerCase(); // 169 } // 170 } // 171
Как бы показал возможности scala при работе с xml. Доделать так и не смог, если кому интересно, что может гугол насочинять - флаг в руки и передаю. Кстати, есть надежда , что если не ограничиться запросом с одного сайта (AzLyrics.com) - scrapping под него заточен, усложнив алгоритм, то можно будет получать стопудовые хиты, page ranking, однако. А это уже реальные деньги.
Итак, есть аж три способа работы с xml //68, //81, //102 Можно взять пример нагляднее из [[ Scalable Programming Abstractions for XML Services.pdf ]]
Код
<?xml version="1.0"?> <purchaseOrder orderDate="1999-10-20"> <shipTo country="US"> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Mill Valley</city> <state>CA</state> <zip>90952</zip> </shipTo> <billTo country="US"> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>Old Town</city> <state>PA</state> <zip>95819</zip> </billTo> <comment>Hurry, my lawn is going wild!</comment> <items> <item partNum="872-AA"> <productName>Lawnmower</productName> <quantity>1</quantity> <USPrice>148.95</USPrice> <comment>Confirm this is electric</comment> </item> <item partNum="926-AA"> <productName>Baby Monitor</productName> <quantity>1</quantity> <USPrice>39.98</USPrice> <shipDate>1999-05-21</shipDate> </item> </items> </purchaseOrder>
... //Retrieve the docu__ment object DocumentBuilder fact = DocumentBuilderFactory.newInstance().newDocumentBuilder(); docu__ment po = fact.parse(new File("po.xml")); Element root = po.getDocumentElement();
//Retrieve all partNums and compute the grand total for the purchase order double total = 0; NodeList children = root.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); //Find the items child element if ("items".equals(node.getLocalName())) { NodeList itemList = node.getChildNodes(); for (int j = 0; j < itemList.getLength(); j++) { Node item = itemList.item(j);
//Get the partNum attribute value NamedNodeMap attrs = item.getAttributes(); System.out.println("partNum:" + attrs.getNamedItem("partNum"));
//Find the USPrice child element NodeList itemChildren = item.getChildNodes(); for (int k = 0; k < itemChildren.getLength(); k++) { Node child = itemChildren.item(k); if ("USPrice".equals(child.getLocalName()) { total += Double.valueOf(child.getNodeValue()).doubleValue(); } } } } } System.out.println("Grand total = " + total);
То же, посредством Scala:
Код
import scala.xml.XML;
val doc = XML.loadFile("po.xml"); var total = 0; for(val z <- doc \\ "item"; val y <- z \ "USPrice") { Console.println("partnum: " + z \ "@partNum"); total = total + Double.valueOf(y.text) } Console.println("Grand total " + total);
Человеку, знакомому с XPath, и комментариев не надо по функциональности кода.
Собственно, эти фичи объясняются тем, что язык предназначен для компонентного программирования. Есть программная статья Martin'a Odersky, ведущего разработчика языка.
Цитата
У нас сотни языков программирования, и ещё больше проектируется каждый год. Поэтому очень тяжело оправдать разработку ещё одного. Тем не менее, это я и попытаюсь сделать здесь. Мои доводы основываются на следующих заявлениях:
** Возрастающая важность веб сервисов и распределённых вычислений вообще, представляется фундаментальным смещением парадигмы в программировании. По масштабам это сравнимо переходом от символьно - ориентированных к графическим интерфейсам, произошедшим 20 лет назад.
** Этот сдвиг парадигмы обеспечит потребность в новых языках программирования, также как графические интерфейсы способствовали принятию объектно - ориентированных языков.
Далее речь идёт об xml, обмене данными, о несоответствии этой задаче объектро - ориентированных языков, иначе : об несоответствии импеданса (_impedance mismatch_). О том как решается эта задача, например, через представление xml в DOM. При этом часто теряется важная семанитческая особенность, присущая данным в xml.
Цитата
Напротив, работа с деревьями - естественная область для функциональных языков. Их алгебраические типы данных, соответствия паттерну, функции высшего порядка, делают эти языки идеальными для таких задач.
И далее объясняется, что необходим мультипарадигменный язык, и что Software Composition and Architecture LAnguage, scala - попытка реализации такого языка. Статья называется _"Scala Rationale"_. Там всё подробней и интересней.
Обещание сдержал, для чего нужен язык прояснил. Хоть и получилось это скомканно. Впрочем, ссылки с обстоятельным изложением упоминались.
И хотя планов громадьё, например, здорово было бы прикрутить scala к какому - нибудь j2ee framework'у. И вообще, рассказать, о J2EE в стиле funck - реально забавная вешь пришла в голову . Но времени на всё хватает. Если всё же, кто -то заинтересовался, в частности, проекцией реляций БД в rdf + rdfs (owl lite) и сервером приложений (модулем сервера), транслирующем, запросы, _например_, на sparql, или естественном языке, в sql запросы, а также делающем всё остальное, что положено делать таким серверам (модулям), то меня найти, думаю, будет несложно.
А вот ещё впечатления, в виде дампа, может будут кому интересны.
/*************************************************** Несколько слов по поводу компилятора. Устаревших, но о многом говорящих. */
О впечатлениях. Мне компилятор не очень нравится. Если со скоростью ещё можно смириться, то насчёт дуракоустойчивости, ничего хорошего не скажу. Создаётся впечатление, что он пока не уровня промышленного использования. Это, конечно, только _впечатления_, никаких объективных тестов, оценок не проводил, но судите сами: правильный код
Код
def hasSongTitle(node: Node): boolean = { node.child.exists( ch: Node => ( ch match { case <b>{chivauva @ _*}</b> => true; //*** case _ => false; })); }
Тут что? Функция принимает узел node xml - дерева. Его метод child возвращает набор Seq потомков узла. Seq, между прочим, включает mixin (читай, реализует интерфейс) Iterable. Последний имеет метод exists, принимающий параметром булевозначную функцию (говорят ещё предикат). Exists вернёт true, только если найдётся элемент в Seq, реализующий функцию. В даннном случае это анонимная функция от Node. Смысл её в сравнении с образцом. `_` - означает `что - угодно`, `любой, произвольный`. Первый вариант подразумевает `многократно что угодно` (из - за комбинации _* = `_` +`*`(wildcard)), заключённое в <b> </b> комбинацию, что вместе, есть правильный xml документ, если не обращать внимание на пропуск директивы <?xml version='1.0'?>. Причём это `что угодно`, по ходу дела, именуется (@), как `chivauva`. Эти действия позволительны постольку, поскольку заключены в {} - скобки. Можно понять меня, по неопытности решившего заменить
Код
case <b>{chivauva @ _*}</b> => true; на case <b>{ _*}</b> => true;
- вариант попроще, да и неважно содержимое узла <b></b> - не используется оно нигде. Важно сравнение двух случаев node - это 'b', или прочее (второй вариант).
Итак, при слабой документационной поддержке, я упрощённо использовал _* На что компилятор выплюнул
Код
[dm@pepper Music_scala]$ scalac MParse.scala Exception in thread "main" java.lang.Error: unit = MParse.scala; tree = (_)* at scala.Predef$.error(Predef.scala:155) at scala.tools.nsc.matching.PatternMatchers$PatternMatcher.patternNode(P atternMatchers.scala:372) at scala.tools.nsc.matching.PatternMatchers$PatternMatcher.enter1(Patter nMatchers.scala:447) at scala.tools.nsc.matching.PatternMatchers$PatternMatcher.enter(Pattern Matchers.scala:506) at scala.tools.nsc.matching.PatternMatchers$PatternMatcher.enter1(Patter nMatchers.scala:476) ...................................................................... кусок в два раза больше оставленного ......................................................................
at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:1039) at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:22) at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:208) at scala.tools.nsc.Global$GlobalPhase$$anonfun$1.apply(Global.scala:197) at scala.tools.nsc.Global$GlobalPhase$$anonfun$1.apply(Global.scala:197) at scala.Iterator$class.foreach(Iterator.scala:285) at scala.collection.mutable.ListBuffer$$anon$0.foreach(ListBuffer.scala: 216) at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:197) at scala.tools.nsc.Global$Run.compileSources(Global.scala:422) at scala.tools.nsc.Global$Run.compile(Global.scala:480) at scala.tools.nsc.Main$.process(Main.scala:60) at scala.tools.nsc.Main$.main(Main.scala:80) at scala.tools.nsc.Main.main(Main.scala)
После часового(!) бдения и вылавливания блох я, наконец, решил взяться за ум и искать самое очевидное и простое решение проблемы. Короче, локализовал ошибку. Вопрос: "а на хрена мне эта распечатка стека?" Кроме того, java.lang.Error и весь этот мусор создают впечатление, что никакой иерархии исключений и их обработки не продумано, а все проблемы решаются "подметанием мусора по ковёр" и printStackTrace. Я, конечно, делаю много допущений, но уж сыровато всё выглядит. Стоит обратить внимание, на то, какая ошибка и где (строки номер) компилятор _так и не выдал_.
update: Вчера скачал версию 2.1.5 Всё ОК. Разумный вариант _* как и ожидалось, работает. Хм, Odersky месяца два назад искал аспиранта в свою группу, не с этим ли всё связано? Осадок всё - таки остался, теперь, пожалуй, я не столь уж настроен использовать scala как вспомогательный язык. Разбавлять этим сахарочком java код. Кто их знает, что там ещё выдаст транслятор. Подождём, когда серьёзная компания заинтересуется. Вот только кто? В похожем случае с Nemerle это, естественно, может быть Microsoft, а насчёт Scala как?
/*************************************************** О том сколько чашек чёрного кофе надо выпить, чтобы кусок рафинада во рту почувствовать. */
Кстати, каков возможный аналог в java следующему: (взято из той же _Scalable Programming Abstractions for XML Services.pdf_)
Код
object Test extends Application { abstract class Term; case object True extends Term; case class Var(i : int) extends Term; case class Not(term : Term) extends Term; case class And(left : Term, right : Term) extends Term;
def eval(term : Term, env : Array[Boolean]) : Boolean = term match { case True => true; case Var(i) => env(i); case Not(t) => !eval(t, env); case And(l, r) => eval(l, env) && eval(r, env); }
def simpl(term : Term) : Term = term match { case True | Var(_) => term; case Not(Not(x)) => simpl(x); case Not(x) => Not(simpl(x)); case And(l, r) => And(simpl(l), simpl(r)); }
Используя эти конструкции пропозициональная форма $x_1 \land \lnot (\lnot x_2 \land x_3)$, может быть реализована: Not( And( Var(1), Not( Var(2) ) ) ), и без всяких new, с возможностью декомпозиции и работы с ней - посредством механизма сравнения по щаблону (pattern matching). А вообще, пишут, что подобные конструкции введены как аналоги алгебраическим типам данных, которыми оперируют такие известные функциональные языки, как ML, Haskell. Что сие такое - для меня великая тайна есть. А вот что будет после .scala > scalac > byte-code > decompiler > .java, узнать несложно Вот выборочно два класса.
Код
// Decompiled by DJ v2.6.6.51 Copyright 2000 Atanas Neshkov Date: 27.05.2006 18:43:55 // Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version! // Decompiler options: packimports(3) // Source File Name: invers.scala
public class And extends Term implements ScalaObject, CaseClass, Serializable {
public final String caseName() { return "And"; }
public final int caseArity() { return 2; }
public final Object caseElement(int i) { int j = i; Term term1; if(j != 0) { if(j != 1) { if(true) { /*<invalid signature>*/java.lang.Object _tmp = null; Object obj = null; term1 = obj; } else { boolean _tmp1 = true; throw new MatchError(BoxedInt.box(j)); } } else { Term term2 = right(); term1 = term2; } } else { Term term = left(); term1 = term; } return term1; }
public boolean equals(Object obj) { return .MODULE$._equals(this, obj); }
public String toString() { return .MODULE$._toString(this); }
public int hashCode() { return .MODULE$._hashCode(this); }
public final int _mth$tag() { return 0xbf6dfa7b; }
public Term right() { return right; }
public Term left() { return left; }
private Term right; private Term left;
public And(Term term, Term term1) { left = term; right = term1; super(); } }
Код
import scala.*;
public final class Test$ implements Application, ScalaObject {
public Test$() { expression = new Test.Not(new Test.And(new Test.Var(1), new Test.Not(new Test.Var(2)))); super(); scala.Application.class._mth$init$(this); }
public Test.Not expression() { return expression; }
слишком много автор нагнал. однако я все до конца не дочитал (терпения не хватило).
такое впечатление что автор имеет отношение к отечественной науке.
по поводу последнего поста - знаешь за сколько строк я уложусь если писать все на перле? почему автор в тексте скалы использует XPath а в жаве сравнивает имена нод?
что за чушь? кто вообще придумал ? это занятие называется что сделать чтобы убить время
Нет, Scalable Programming Abstractions for XML Services.pdf - ты, похоже, не читал. Автор не русский, к науке отношение имеет. Ты, наверное, сделал вывод лишь по тем отрывкам, что я процитировал. Мне кажется, это не чушь, и это не занятие, чтобы убить время. У них там всё убедительно разжёвывается
В Java есть два стандартных способа работы с xml, и они вынесены в библиотеки. В Scala, xml законный тип данных, и возможно: val node = <foo><bar/>!</foo> Поддержка xml - встроена в язык. То, что выбран xpath - да, похоже, уловка, для большей эффектности.
В сколько строк ты на перле уложишься? Откуда ж мне знать... Сдаётся, ты сам не представляешь. Давай, приведи аналог следущему:
Код
import scala.xml.XML;
object FooBar extends Application { val doc = XML.loadFile("po.xml"); var total = 0; for(val z <- doc \\ "item"; val y <- z \ "USPrice") { Console.println("partnum: " + z \ "@partNum"); total = total + Double.valueOf(y.text) } Console.println("Grand total " + total); }
для твоего сведения Фома. Во всех обьектных языках существует возможность создавать свои типы. Как это реализовано - это другой вопрос. Задача которую ты написал - тривиальна и потому никому не нужна.
можешь дальше читать Scalable Programming Abstractions for XML Services.pdf вообще эта книжка для детей которые только что узнали что такое хмл и горят желанием применить его на практике.
То что он тормозной, плохомасштабируемый и нестабильно работающий это мало кого волнует. Ну чтож - занимайтесь наукой - вот за такие бесполезные работы им и платят деньги. Соответственно много тут платить и не надо ибо пользы нет.
Значит так получается? "Все вы дураки и не лечитесь, одна я стою в белом пальто, красивая..."? (с)
Ну что ж. Начнём с того, что код делает не то что требуется. И если ты напишешь правильный вариант, то строчек там будет не меньше.
Мне кажется, perl, с глобальными переменными, появляющимися в теле цикла ещё менее масштабируем Честно говоря, я не уверен, что код работает Под рукой perl'а нет, и я не знаток, но рискну утверждать , что это неверно синтаксически: use XML::XPath;
ну извини - я не проверял этот код. но он работает - вместо $species должно быть $_
код делает то что надо, возможно потребуется расставить точки и запятые но я этого делать не буду.
сравнивать код языков по количеству строчек так же глупо как сравнивать девушек по длине волос
сравнивать языки по степени подготовки к повсеместной глобализации данных и использования xml с использованием приведенных выше методик глупо. (какая может быть дуракостойкость компилятора в этой задаче?)
займитесь лучше изучением алгоритма быстрого доступа к данным (в БД) или скажем распознавание образов - определяя схожесть снимков. Мне кажется в ярике есть конторы которые за такие вещи дадут бабло.
А выбирать язык на котором писать по моему это глупо. Все что угодно может быть написано на жаве и на ++ и на скале. Насколько это удобно ? - пофиг. Насколько будет код компактным - пофиг. Насколько быстро он будет компилироваться - пофиг. Главное чтобы это работало. Кстати чуть не забыл - так же пофиг как там будет расставлены фигурные скобки (еще с универа этот вопрос меня раздражает).
1 сцылка автор несет полную херь про ограничения жавы. какие и в чем? (нет множественного наследования чтоли? тогда даже думающим человеком автора назвать сложно)
в этом форуме 20 ответов что говорит о очень активном интересе участников.
2 сцылка более интересная, я даже зачитался и задумался - сколько денег было потрачено на такую ахинею. И главное зачем? То же самое можно сделать на жава или на перле если уж на то пошло. На жаве поддерживать большие проекты проще чем на скале.Да и время разработки будет меньше.
1 Грубить насчёт хери не стану - лучше буду учиться уважать чужое мнение. Кстати, рекомендую обратить внимание и на состав участников.
По поводу недостатков/сложности языка Java? Ну, например, модель многопоточности - процессы с разделяемой памятью. Довольно таки низкоуровневый подход, однако же опирающийся на систему многопоточности ОС. Отсюда и ограничения на число потоков. Что вполне актуально для современных задач и многоядерных процессоров. В scala - те же ограничения, но из - за абстракций более высокого уровня - программировать/верифицировать код легче. Это так, навскидку пример.
2 Выражение "полный по Тьюрингу язык" что тебе говорит?. Всё то же можно сделать и на си и на ассемблере, и на... Однако, люди почему - то не программируют теперь на коммутационных панелях и ассемблер уже не язык общего пользования. Собственно, Scala для определённых задач и создавался. Назовём их веб - сервисами. Не соглашусь, что поддерживать большие проекты проще на java (если рассматривать задачу без IDE). Именно преимущества Scala в программировании "в малом" и "в большом" дают фору java. Об этом на rsdn.
<?php $sum=0; foreach (xpath_eval_expression(xpath_new_context(domxml_open_file("po.xml")),'/purchaseOrder/items/item/USPrice')->nodeset as $node) $sum+=$node->get_content(); print $sum; ?>
по-моему проще, чем на SCALA.
А вообще, вся тема какая-то бредовая. Примеры из документации SCALA, перемешанные с рассуждениями об opensource, реляционными БД и xml. Фома, не думал завести себе блог и писать все это туда? :-)
1 Грубить насчёт хери не стану - лучше буду учиться уважать чужое мнение. Кстати, рекомендую обратить внимание и на состав участников.
По поводу недостатков/сложности языка Java? Ну, например, модель многопоточности - процессы с разделяемой памятью. Довольно таки низкоуровневый подход, однако же опирающийся на систему многопоточности ОС. Отсюда и ограничения на число потоков. Что вполне актуально для современных задач и многоядерных процессоров. В scala - те же ограничения, но из - за абстракций более высокого уровня - программировать/верифицировать код легче. Это так, навскидку пример.
2 Выражение "полный по Тьюрингу язык" что тебе говорит?. Всё то же можно сделать и на си и на ассемблере, и на... Однако, люди почему - то не программируют теперь на коммутационных панелях и ассемблер уже не язык общего пользования. Собственно, Scala для определённых задач и создавался. Назовём их веб - сервисами. Не соглашусь, что поддерживать большие проекты проще на java (если рассматривать задачу без IDE). Именно преимущества Scala в программировании "в малом" и "в большом" дают фору java. Об этом на rsdn.
1 я уважаю авторитетные мнения которые приведены с обоснованием. а так типа для того чтобы поучаствовать в холиварах - уже отошел.
2 где вы видели хоть один большой проект на скала, чтобы утверждать что там и вебсервисы лучше и сахар слаще.
вы вообще сталкивались в своей карьере с серверами приложений типа веблоджик или вебсферой? там вебсервис можно создать абсолютно не прибегая к кодированию - но ведь никто из жавистов не бегает и не орет на каждом углу что это так опупенно что просто лучший язык.
для каждого мнения надо обоснование, а собственно обоснования в данной ветке я не увидел - так же как и не увидел его в приведенных линках.