13.08.08

Чуть-чуть анонсов и злободневное

Ребят, статья про метапрограммировние в io обязательно будет, честное слово. У меня сейчас очередной аврал на работе, продолжающийся последний месяц.

split и Importer

Я очень переживаю в данный момент за два непонятных момента в реализации io, кушать не могу даже. 1. Метод String split По сути всё понятно, сплит бьёт строку в список строк, однако если передать split'у примерно нисколько параметров он начинает думать, что строку бить надо по пробелам, а не по символам, в том же руби ситуация выглядит лучше. На днях потребовалось мне разбить строку на символы, и пришлось писать вот такой велосипед.
"String" foreach(char, list append(char)); return list
2. Стандартный дзэнский импортер io (Importer) Я про него писал в одной из статей, он прикольный, но у него выискалось какое-то странное требование. В выходные писал себе фильтр для org-mode (соус ниже), и потребовалось мне на него написать юнит-тесты (благо UnitTest в стандартной поставке), дак вот файл с тестами не хотел импортировать OrgParser до тех пор, пока я не назвал и сам объект и файл его хранящий с большой буквы, много думаю до сих пор, бага или фича. Наколеночный парсер org-mode, выдирает записи оттэганные определённым тэгом и строит «отчёт»:

Using := Object clone do (
  show := method(
    """Org parser and report generator.
Created by sdfgh153, 2008-08-10.
Using: 
    OrgParser.io <orgfile> <tag>""" println
  )
)

OrgParser := Object clone do (  
  
  parse := method(file, tag,    

    records  := List clone 
    orgFile  := File clone openForReading(file)    

    orgFile foreachLine(line,
      if(line containsSeq(":#{tag}:" interpolate), 
        records append(
          line lstrip("*") rstrip(":#{tag}:" interpolate) strip
        )
      )
    )
    orgFile close
    return records
  )
)

OrgReport := Object clone do (

  reportDir := "/home/semka/gtd/"

  date   := """#{Date now day asString}.
               #{Date now month asString}.
               #{Date now year asString}""" interpolate

  date   := date asMutable replaceSeq("\n", "") replaceSeq(" ", "")
 
  lines  := List clone
  output := "#{reportDir}/#{date}.todo" interpolate  
  tag    := String clone

  getHTMLReport := method(
    "Todo me" println
    return self output
  )

  getTextReport := method(

    out := File with(self output)
    if(out exists,      
      out remove close
    )

    txtReport := out openForUpdating

    txtReport write("\"#{self tag}\" tag summary, #{self date}\n" interpolate)
    lines foreach(line,
      txtReport write ("- ", "#{line} [ ]" interpolate, "\n")
    )

    txtReport close
    return self output
  )
)

if(System args size != 3,
  Using show,
  OrgReport lines = OrgParser parse(
    System args at(1) asString, 
    System args at(2) asString
  )
  OrgReport tag = System args at(2)
  OrgReport getTextReport print
)
Если кому-то интересно, допилю до вменяемого состояния, сделаю html-репорты, в планах было сделать TeX репорты, но я всё ещё думаю. Привет.

1 коммент.:

lebaon комментирует...

Что то я не понимаю, как импортер этот работает, вот что надо сделать, что б в сборке для винды получить доступ к опен гл?

Отправить комментарий