Ярославль


Страницы: (3) 1 [2] 3   ( Перейти к первому непрочитанному сообщению ) Ответ в темуСоздание новой темыСоздание опроса

Scala, programming language

 
Хорошее ли дело задумал Фома? Это интересно читать?
Да, дело хорошее. [ 4 ]  [80.00%]
Нет, это неинтересно. Ф топку! [ 1 ]  [20.00%]
Всего голосов: 5
Гости не могут голосовать 
Фома
Дата 26.05.2006 - 11:26
Цитировать сообщение




Unregistered












РАдости, из бота, ставшей очаровательной собеседницей. smile.gif

С каждым днём всё более любимого Эко старое интервью журналу, название которого
как только у нас не переводят.smile.gif
Цитата

    Ли  Маршалл.  Предположим, вы используете компьютер для рождения
вашего очередного романа; каковы будут ваши действия?

    Умберто  Эко. Я отвечу вам цитатой из собственного эссе, которое
я недавно закончил для антологии Come si scrive un  romanzo  ("Как  написать
роман"),выходящей  в  издательстве  Bompiani.  "Я  просканировал  бы с сотню
романов, не меньшее количество научных  текстов.  Библию,  Коран,  несколько
телефонных  справочников  (в  них  содержится  огромное  количество  имен
собственных). Все  вместе  это  составляет  примерно  миллион  двести  тысяч
страниц.  Потом  я  заложил бы какую-нибудь простую, случайно подвернувшуюся
программу, чтобы все это смешать  и  произвести  в  этом  меланже  кое-какие
изменения. Например, можно убрать оттуда все буквы А. Тогда у меня получился
бы  роман-липограмма.  Следующий  шаг  --  вывести  все  это  на  принтер  и
внимательно  прочесть  несколько раз, выделяя наиболее важные пассажи. Потом
погрузить продукт в трейлер и отвезти на ближайший мусоросжигающий завод. И,
глядя,  как все это горит синим пламенем, я сидел бы поддеревом с карандашом
в  руке,  праздно  размышляя,  покуда  в  голову  не  придет  пара  строк,
заслуживающая  того,  чтобы  занести  их  на  бумагу. Например: "Луна плывет
высоко в небе  --  лес  шумит".На  первый  раз  наш  роман  вряд  ли  сможет
конкурировать с хайку. Но это не имеет значения. Главное -- начать.


Многие считают, что "ещё чуть - чуть" - сеть достигнет критической точки, и "поумнеет". Другие относятся к сети более прагматично, что ли? Взять, к примеру, прошлогодние заявления мистера О'Reilly smile.gif. В частности, о том, что web это платформа. В самом деле, данных там с избытком, хоть и порядка никакого. Ну вот. Почему бы не использовать сеть как оракула уже сейчас, разумеется, не задавая слишком сложные вопросы. А там, глядишь, сеть и "поумнеет" (тогда и будем писать "Сеть" - с большой буквы). Хитрость в том, что очень часто, людям нужен не правильный ответ, а тот, который они ожидают. Для машины путь Умберто Э. неприемлем, конечно.

Задача такая:
зарегистрироваться на google и скачать там api
с помощью запросов на google, сочинить пару песенных куплетов.
чтобы было веселей оформить всё это онегинской строфой.

Вот пояснения.
По поводу api: http://www.google.com/apis/
http://groups.google.com/groups?hl=en&...public.web-apis
Забавно, дистрибутив занимает 666кБ. Всё те же сотонинские шуточки smile.gif
Разумеется и без него можно обойтись. Но ведь предлагают... Как тут откажешься, ведь даром!
Компания клепает новые сервисы - как пирожки печёт. Даже доменные имена под них не регистрирует. Пример: ~ google.com/musicsearch, но он не достаточно гибкий. Лучше взять классику.

По поводу песенок сочинения. Ну попса, ну cлов немного, рифмовка несложная.
... name
... fire
... way
....die

Чтобы не усложнять алгоритм - будем считать что строки рифмуются крест - накрест.
Конечно, всякое может случится: певице - дуре придёт в голову многократно и грязно выругаться,
песня может попасться сложной. Но, в конечном счёте, большинство держатся в канве: break-heart-make-hurt.
От первой песни берём три строчки первого куплета и размазываем по всему сонету в качестве первых строк четверостиший. Остальные три строки в каждом стихе выцарапываются из сети.

Насчёт сонета по Пушкину:

Цитата

Она любила на балконе
Предупреждать зари восход,
Когда на бледном небосклоне
Звезд исчезает хоровод,

И тихо край земли светлеет,
И, вестник утра, ветер веет,
И всходит постепенно день.
Зимой, когда ночная тень

Полмиром доле обладает,
И доле в праздной тишине,
При отуманенной луне,
Восток ленивый почивает,

В привычный час пробуждена
Вставала при свечах она.


Т.е. четыре строки - перекрёстная рифмовка, затем четыре строки парной - 1-я со 2 - й, 3-я с 4-й;
ещё четверостишие рифмуется так: 1 - 4, 2 -3. И последние две рифмующиеся строки.
В них проблема. Будем брать их из припева самой первой stuff-песни, ну, или другой - чтобы поменьше на плагиат смахивало smile.gif.

Всё. Достаточно формализована задача. Можно приступать.

Код

/*********************************************************************          // 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. Доделать так и не смог, если кому интересно,
что может гугол насочинять - флаг в руки и передаю. Кстати, есть надежда smile.gif, что если не ограничиться запросом с одного сайта (AzLyrics.com) - scrapping под него заточен, усложнив алгоритм, то можно будет получать стопудовые хиты, page ranking, однако. А это уже реальные деньги. smile.gif

Итак, есть аж три способа работы с 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>

Обработка использующая DOM.
Код

import org.w3c.dom.docu__ment;
import org.w3c.dom.Element;

... //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 - реально забавная вешь пришла в голову biggrin.gif.
Но времени на всё хватает. Если всё же, кто -то заинтересовался, в частности, проекцией реляций БД в 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 месяца два назад искал аспиранта в свою группу, не с этим ли всё связано? smile.gif
Осадок всё - таки остался, теперь, пожалуй, я не столь уж настроен использовать 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));
}

val expression = Not( And( Var(1), Not( Var(2) ) ) )    
}

Используя эти конструкции пропозициональная форма $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

import java.io.Serializable;
import scala.*;
import scala.runtime.BoxedInt;
import scala.runtime.ScalaRunTime$;

public class And extends Term
   implements ScalaObject, CaseClass, Serializable
{
Top
Фома
Дата 26.05.2006 - 11:32
Цитировать сообщение




Unregistered












А зараза! Не уложился в 222 smile.gif
Код

// 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

import java.io.Serializable;
import scala.*;
import scala.runtime.BoxedInt;
import scala.runtime.ScalaRunTime$;

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;
   }

   public Test.Term simpl(Test.Term term)
   {
_L11:
       Test.Term term1 = term;
       term1;
       Test.True.  = Test.True..MODULE$;
       JVM INSTR dup;
       JVM INSTR ifnull 21;
          goto _L1 _L2
_L1:
       break MISSING_BLOCK_LABEL_11;
_L2:
       break MISSING_BLOCK_LABEL_21;
      ;
       equals();
       JVM INSTR ifne 47;
          goto _L3 _L4
_L3:
       break MISSING_BLOCK_LABEL_26;
_L4:
       break MISSING_BLOCK_LABEL_47;
       JVM INSTR pop;
       if( == null)
           break MISSING_BLOCK_LABEL_47;
       if(!(term1 instanceof Test.Var))
       {
           if(false)
               break; /* Loop/switch isn't completed */
       } else
       {
           Test.Var var = (Test.Var)term1;
           if(true)
               break; /* Loop/switch isn't completed */
       }
       break MISSING_BLOCK_LABEL_51;
       if(true)
           break; /* Loop/switch isn't completed */
       if(term1 instanceof Test.Not) goto _L6; else goto _L5
_L5:
       if(term1 instanceof Test.And) goto _L8; else goto _L7
_L7:
       false;
         goto _L9
_L8:
       Object obj;
       Test.And and = (Test.And)term1;
       Test.Term term5 = and.left();
       Test.Term term6 = and.right();
       Test.And and1 = new Test.And(simpl(term5), simpl(term6));
       obj = and1;
       break MISSING_BLOCK_LABEL_208;
_L6:
       Test.Not not;
       not = (Test.Not)term1;
       if(not.term() instanceof Test.Not)
           break MISSING_BLOCK_LABEL_178;
       if(true)
       {
           Test.Term term4 = not.term();
           Test.Not not2 = new Test.Not(simpl(term4));
           obj = not2;
           break MISSING_BLOCK_LABEL_208;
       }
       true;
_L9:
       JVM INSTR pop;
       throw new MatchError(term1);
       Test.Not not1 = (Test.Not)not.term();
       Test.Term term3 = not1.term();
       term = term3;
       if(true) goto _L11; else goto _L10
_L10:
       Test.Term term2 = term;
       obj = term2;
       return ((Test.Term) (obj));
   }

   public boolean eval(Test.Term term, boolean aflag[])
   {
       Test.Term term1 = term;
       term1;
       Test.True.  = Test.True..MODULE$;
       JVM INSTR dup;
       JVM INSTR ifnull 23;
          goto _L1 _L2
_L1:
       break MISSING_BLOCK_LABEL_12;
_L2:
       break MISSING_BLOCK_LABEL_23;
      ;
       equals();
       JVM INSTR ifne 178;
          goto _L3 _L4
_L3:
       break MISSING_BLOCK_LABEL_29;
_L4:
       break MISSING_BLOCK_LABEL_178;
       JVM INSTR pop;
       if( == null)
           break MISSING_BLOCK_LABEL_178;
       boolean flag1;
       if(!(term1 instanceof Test.Var))
       {
           if(!(term1 instanceof Test.Not))
           {
               if(!(term1 instanceof Test.And))
               {
                   false;
                   throw new MatchError(term1);
               }
               Test.And and = (Test.And)term1;
               Test.Term term3 = and.left();
               Test.Term term4 = and.right();
               boolean flag4 = eval(term3, aflag) && eval(term4, aflag);
               flag1 = flag4;
           } else
           {
               Test.Not not = (Test.Not)term1;
               Test.Term term2 = not.term();
               boolean flag3 = !eval(term2, aflag);
               flag1 = flag3;
           }
       } else
       {
           Test.Var var = (Test.Var)term1;
           int i = var.i();
           boolean flag2 = aflag[i];
           flag1 = flag2;
       }
       break MISSING_BLOCK_LABEL_185;
       boolean flag = true;
       flag1 = flag;
       return flag1;
   }

   public int _mth$tag()
   {
       return scala.ScalaObject.class._mth$tag(this);
   }

   public final void executionStart_$eq(long l)
   {
       executionStart = l;
   }

   public final long executionStart()
   {
       return executionStart;
   }

   public void main(String args[])
   {
       scala.Application.class.main(this, args);
   }

   public static final Test$ MODULE$ = this;
   private long executionStart;
   private Test.Not expression;

   public static
   {
       new Test$();
   }
}

Предполагается, это должно показывать сложность java кода по сравнению со scala, да при том же функционале. Помним, также, о синтаксисе.


/***************************************************
И ещё немножко.
*/

Здесь будет ссылка на wikibook с переводом двух глав книги "Scala by Examlpes".
Top
gheuy
Дата 30.05.2006 - 17:31
Цитировать сообщение




В малиновых штанах
*****

Профиль
Группа: Пользователи
Сообщений: 1028
Пользователь №: 5068
Регистрация: 25.10.2005 - 13:25





слишком много автор нагнал.
однако я все до конца не дочитал (терпения не хватило).

такое впечатление что автор имеет отношение к отечественной науке.

по поводу последнего поста - знаешь за сколько строк я уложусь если писать все на перле?
почему автор в тексте скалы использует XPath а в жаве сравнивает имена нод?

что за чушь? кто вообще придумал ? это занятие называется что сделать чтобы убить время
PMПисьмо на e-mail пользователю
Top
Фома
Дата 31.05.2006 - 16:41
Цитировать сообщение




Unregistered












Нет, Scalable Programming Abstractions for XML Services.pdf - ты, похоже, не читал.
Автор не русский, к науке отношение имеет. Ты, наверное, сделал вывод лишь по тем отрывкам, что я процитировал. Мне кажется, это не чушь, и это не занятие, чтобы убить время. У них там всё убедительно разжёвывается

В Java есть два стандартных способа работы с xml, и они вынесены в библиотеки.
В Scala, xml законный тип данных, и возможно: val node = <foo><bar/>!</foo>
Поддержка xml - встроена в язык.
То, что выбран xpath - да, похоже, уловка, для большей эффектности.

В сколько строк ты на перле уложишься? Откуда ж мне знать... smile.gif Сдаётся, ты сам не представляешь.
Давай, приведи аналог следущему:

Код

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);
}

Top
gheuy
Дата 2.06.2006 - 12:20
Цитировать сообщение




В малиновых штанах
*****

Профиль
Группа: Пользователи
Сообщений: 1028
Пользователь №: 5068
Регистрация: 25.10.2005 - 13:25





use XML::XPath;

foreach (XML::XPath->new(filename => 'files/camelids.xml')->find('//species')->get_nodelist){
$c += $species->find('common-name')->string_value
}
print $c
PMПисьмо на e-mail пользователю
Top
gheuy
Дата 2.06.2006 - 12:24
Цитировать сообщение




В малиновых штанах
*****

Профиль
Группа: Пользователи
Сообщений: 1028
Пользователь №: 5068
Регистрация: 25.10.2005 - 13:25





для твоего сведения Фома.
Во всех обьектных языках существует возможность создавать свои типы. Как это реализовано - это другой вопрос.
Задача которую ты написал - тривиальна и потому никому не нужна.

можешь дальше читать Scalable Programming Abstractions for XML Services.pdf вообще эта книжка для детей которые только что узнали что такое хмл и горят желанием применить его на практике.

То что он тормозной, плохомасштабируемый и нестабильно работающий это мало кого волнует. Ну чтож - занимайтесь наукой - вот за такие бесполезные работы им и платят деньги. Соответственно много тут платить и не надо ибо пользы нет.
PMПисьмо на e-mail пользователю
Top
gheuy
Дата 2.06.2006 - 12:25
Цитировать сообщение




В малиновых штанах
*****

Профиль
Группа: Пользователи
Сообщений: 1028
Пользователь №: 5068
Регистрация: 25.10.2005 - 13:25





use XML::XPath;

$c += $species->find('common-name')->string_value foreach (XML::XPath->new(filename => 'files/camelids.xml')->find('//species')->get_nodelist)
PMПисьмо на e-mail пользователю
Top
Фома
Дата 2.06.2006 - 15:06
Цитировать сообщение




Unregistered












Значит так получается?
"Все вы дураки и не лечитесь, одна я стою в белом пальто, красивая..."? (с)

Ну что ж.
Начнём с того, что код делает не то что требуется.
И если ты напишешь правильный вариант, то строчек там будет не меньше.

Мне кажется, perl, с глобальными переменными, появляющимися в теле цикла ещё менее масштабируем smile.gif
Честно говоря, ph34r.gif я не уверен, что код работает smile.gif
Под рукой perl'а нет, и я не знаток, но рискну утверждать smile.gif,
что это неверно синтаксически:
use XML::XPath;

$c += $species->find('common-name')->string_value foreach (XML::XPath->new(filename => 'files/camelids.xml')->find('//species')->get_nodelist)

//$species - ???


Но мне интереснее это:
Цитата
Задача которую ты написал - тривиальна и потому никому не нужна.


Что именно?

Ты делаешь резкие высказывания, не потрудившись их пояснить. Это интересно,
если ты прав. Но прав ли?
Top
gheuy
Дата 2.06.2006 - 16:55
Цитировать сообщение




В малиновых штанах
*****

Профиль
Группа: Пользователи
Сообщений: 1028
Пользователь №: 5068
Регистрация: 25.10.2005 - 13:25





ну извини - я не проверял этот код. но он работает - вместо $species должно быть $_

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

сравнивать код языков по количеству строчек так же глупо как сравнивать девушек по длине волос

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

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

А выбирать язык на котором писать по моему это глупо. Все что угодно может быть написано на жаве и на ++ и на скале. Насколько это удобно ? - пофиг.
Насколько будет код компактным - пофиг. Насколько быстро он будет компилироваться - пофиг. Главное чтобы это работало.
Кстати чуть не забыл - так же пофиг как там будет расставлены фигурные скобки (еще с универа этот вопрос меня раздражает).

Вам надо шашечки или ехать ?
PMПисьмо на e-mail пользователю
Top
Фома
Дата 10.06.2006 - 11:48
Цитировать сообщение




Unregistered












Top
gheuy
Дата 11.06.2006 - 13:15
Цитировать сообщение




В малиновых штанах
*****

Профиль
Группа: Пользователи
Сообщений: 1028
Пользователь №: 5068
Регистрация: 25.10.2005 - 13:25





1 сцылка автор несет полную херь про ограничения жавы. какие и в чем? (нет множественного наследования чтоли? тогда даже думающим человеком автора назвать сложно)

в этом форуме 20 ответов что говорит о очень активном интересе участников.

2 сцылка более интересная, я даже зачитался и задумался - сколько денег было потрачено на такую ахинею. И главное зачем? То же самое можно сделать на жава или на перле если уж на то пошло. На жаве поддерживать большие проекты проще чем на скале.Да и время разработки будет меньше.

Короче цель непонятна - зачем все это?
PMПисьмо на e-mail пользователю
Top
Фома
Дата 13.06.2006 - 09:58
Цитировать сообщение




Unregistered












1
Грубить насчёт хери не стану - лучше буду учиться уважать чужое мнение.
Кстати, рекомендую обратить внимание и на состав участников.

По поводу недостатков/сложности языка Java? Ну, например, модель многопоточности - процессы с разделяемой памятью. Довольно таки низкоуровневый подход, однако же опирающийся на систему многопоточности ОС. Отсюда и ограничения на число потоков. Что вполне актуально для современных задач и многоядерных процессоров.
В scala - те же ограничения, но из - за абстракций более высокого уровня - программировать/верифицировать код легче. Это так, навскидку пример.

2
Выражение "полный по Тьюрингу язык" что тебе говорит?.
Всё то же можно сделать и на си и на ассемблере, и на... Однако, люди почему - то не программируют теперь на коммутационных панелях smile.gif и ассемблер уже не язык общего пользования.
Собственно, Scala для определённых задач и создавался. Назовём их веб - сервисами.
Не соглашусь, что поддерживать большие проекты проще на java (если рассматривать задачу без IDE).
Именно преимущества Scala в программировании "в малом" и "в большом"
дают фору java. Об этом на rsdn.

Top
ASudakov
Дата 14.06.2006 - 11:55
Цитировать сообщение




Unregistered












рабочий пример на php:
Код
<?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.
Фома, не думал завести себе блог и писать все это туда? :-)
Top
gheuy
Дата 14.06.2006 - 12:06
Цитировать сообщение




В малиновых штанах
*****

Профиль
Группа: Пользователи
Сообщений: 1028
Пользователь №: 5068
Регистрация: 25.10.2005 - 13:25





Цитата (Фома @ 13.06.2006 - 10:58)
1
Грубить насчёт хери не стану - лучше буду учиться уважать чужое мнение.
Кстати, рекомендую обратить внимание и на состав участников.

По поводу недостатков/сложности языка Java? Ну, например, модель многопоточности - процессы с разделяемой памятью. Довольно таки низкоуровневый подход, однако же опирающийся на систему многопоточности ОС. Отсюда и ограничения на число потоков. Что вполне актуально для современных задач и многоядерных процессоров.
В scala - те же ограничения, но из - за абстракций более высокого уровня - программировать/верифицировать код легче. Это так, навскидку пример.

2
Выражение "полный по Тьюрингу язык" что тебе говорит?.
Всё то же можно сделать и на си и на ассемблере, и на... Однако, люди почему - то не программируют теперь на коммутационных панелях smile.gif и ассемблер уже не язык общего пользования.
Собственно, Scala для определённых задач и создавался. Назовём их веб - сервисами.
Не соглашусь, что поддерживать большие проекты проще на java (если рассматривать задачу без IDE).
Именно преимущества Scala в программировании "в малом" и "в большом"
дают фору java. Об этом на rsdn.

1 я уважаю авторитетные мнения которые приведены с обоснованием. а так типа для того чтобы поучаствовать в холиварах - уже отошел.

2 где вы видели хоть один большой проект на скала, чтобы утверждать что там и вебсервисы лучше и сахар слаще.

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

для каждого мнения надо обоснование, а собственно обоснования в данной ветке я не увидел - так же как и не увидел его в приведенных линках.
PMПисьмо на e-mail пользователю
Top
gheuy
Дата 14.06.2006 - 12:08
Цитировать сообщение




В малиновых штанах
*****

Профиль
Группа: Пользователи
Сообщений: 1028
Пользователь №: 5068
Регистрация: 25.10.2005 - 13:25





насчет простоты поддержки - на скала есть удаленный отладчик?
PMПисьмо на e-mail пользователю
Top

Опции темы Страницы: (3) 1 [2] 3  Ответ в темуСоздание новой темыСоздание опроса

 



[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 19 ]   [ GZIP включён ]



Яндекс.Метрика

Правила Ярпортала (включая политику обработки персональных данных)

Все вопросы: yaroslavl@bk.ru