Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Next Entry
В вашем ЯП мало синтаксического сахара? Перчику вам от Оракла.
kelijah
Руки устают от многословности Java? Нет сил на C++ набрать { return a; } и глаза мокреют от зависти к шарповскому сахарку => a;?

Я сейчас перевожу свою реализацию на питоне быстрого нечеткого поиска в БД с помощью алгоритма Левенштейна и Trie. Перевожу на PL/SQL.
PL/SQL - это такой динозавр в мире ЯП, потомок Ады. Если к IF .... THEN .... END IF; можно в конце концов привыкнуть, то вот реализация ООП в PL/SQL это настоящий хардкор. Синтаксический сахар хотите? Синтаксический перец вам в монитор!

Вот пара классов на питоне:

class Cursor(object):
    def __init__(self, node, pos, miss_count ):
        assert(node is not None)
        assert(miss_count>=0.0)
        self.node = node
        self.pos = pos
        self.miss_count = miss_count

    def __str__(self):
        return u'node={} pos={} miss_count={}'.format(self.node.code, self.pos, self.miss_count)


class Cursors(object):
    def __init__(self):
        self.cursors = dict()

    def add(self, cursor):
        node_id = id(cursor.node)
        if node_id in self.cursors:
            if cursor.miss_count < self.cursors[node_id].miss_count:
               self.cursors[node_id] = cursor
        else:
            self.cursors[node_id] = cursor

    def __iter__(self):
        return iter(self.cursors.values())

    def is_empty(self):
        return len(self.cursors)==0




А теперь текущий черновик после перевода на PL/SQL:


CREATE TYPE DUP_Cursor AS OBJECT
(
 node DUP_TrieNodeType,
 pos INTEGER,
 miss_count INTEGER
);

CREATE TYPE DUP_CursorsList IS TABLE OF DUP_Cursor;

create or replace type DUP_Cursors as object
(
 cursors DUP_CursorsList,

 CONSTRUCTOR FUNCTION DUP_Cursors RETURN SELF AS RESULT,
 MAP
 MEMBER FUNCTION is_empty RETURN INTEGER,
 MEMBER FUNCTION count_items RETURN INTEGER,
 MEMBER FUNCTION get_item( i INTEGER ) RETURN DUP_Cursor,
 MEMBER PROCEDURE add_item( new_cursor DUP_Cursor )
);

CREATE OR REPLACE TYPE BODY DUP_Cursors AS

  CONSTRUCTOR FUNCTION DUP_Cursors RETURN SELF AS RESULT
  AS
  BEGIN
    SELF.cursors := DUP_CursorsList();
    RETURN;
  END;


  MAP MEMBER FUNCTION is_empty RETURN INTEGER IS
  BEGIN
    IF cursors.COUNT=0 THEN
     RETURN 1;
    ELSE
     RETURN 0;
    END IF;
  END;

 MEMBER FUNCTION count_items RETURN INTEGER IS
  BEGIN
    RETURN cursors.COUNT;
  END;

 MEMBER FUNCTION get_item( i INTEGER) RETURN DUP_Cursor IS
  BEGIN
    RETURN cursors(i);
  END;

 MEMBER PROCEDURE add_item( SELF IN OUT NOCOPY DUP_Cursors, new_cursor DUP_Cursor ) IS
 i_found INTEGER;
 BEGIN

  i_found := -1;
  FOR i in 1..cursors.COUNT LOOP

   IF cursors(i).node.id = new_cursor.node.id THEN
    IF cursors(i).miss_count > new_cursor.miss_count THEN
     cursors(i).miss_count := new_cursor.miss_count;
    END IF;
    i_found := i;
    EXIT;

   END IF;

  END LOOP;

  IF i_found=-1 THEN
   cursors.EXTEND;
   cursors( cursors.COUNT ) := new_cursor;
  END IF;

 END;
END;
/



Заметили, как изящно ключевое слово MAP отделяет перечень полей и конструктор (sic!) от списка методов класса?

?

Log in

No account? Create an account