В вашем ЯП мало синтаксического сахара? Перчику вам от Оракла.

Sep 06, 2017 18:08

Руки устают от многословности 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!) от списка методов класса?

oracle, pl/sql, забавные мелочи

Previous post Next post
Up