LINUX.ORG.RU

История изменений

Исправление FishHook, (текущая версия) :

Не вижу проблемы в многострочных макросах с отступами на Си.

define FUNCTION(name) {
def name
}

FUNCTION(foo):
   print("Hello word")

Допустим, препроцессор всегда подставляет исходные отступы при подстановке кода в макрос. Пример выше должен работать, препроцессор увидит четыре пробела перед print и в итоге получим такой код:

def foo:
    print("Hello word")

и даже такое сработает:

FUNCTION(bar):
    FUNCTION(baz):
        for i in 1..10:
           print("Hello word")
def bar:
   def baz:
       for i in 1..10:
           print("Hello word")

А дальше придумаем такое:

define FUNCTION(name) {
    try:
}

define END {
   except Exception:
      log.error()
   finally:
      close()
}

и вот тут уже проблемы, потому что, ну допустим

FUNCTION(foo):
    print(1 / 0)
END

превратится в тыкву

def foo:
   try:
   print(1 / 0)  // УПС!!!
   except Exception:
      log.error()
   finally:
      close()

Исправление FishHook, :

define FUNCTION(name) {
def name
}

FUNCTION(foo):
   print("Hello word")

Допустим, препроцессор всегда подставляет исходные отступы при подстановке кода в макрос. Пример выше должен работать, препроцессор увидит четыре пробела перед print и в итоге получим такой код:

def foo:
    print("Hello word")

и даже такое сработает:

FUNCTION(bar):
    FUNCTION(baz):
        for i in 1..10:
           print("Hello word")
def bar:
   def baz:
       for i in 1..10:
           print("Hello word")

А дальше придумаем такое:

define FUNCTION(name) {
    try:
}

define END {
   except Exception:
      log.error()
   finally:
      close()
}

и вот тут уже проблемы, потому что, ну допустим

FUNCTION(foo):
    print(1 / 0)
END

превратится в тыкву

def foo:
   try:
   print(1 / 0)  // УПС!!!
   except Exception:
      log.error()
   finally:
      close()

Исходная версия FishHook, :

define FUNCTION(name) {
def name
}

FUNCTION(foo):
   print("Hello word")

Допустим, препроцессор всегда подставляет отступы при подстановке кода в макрос. Пример выше должен работать, препроцессор увидит четыре пробела перед print и в итоге получим такой код:

def foo:
    print("Hello word")

и даже такое сработает:

FUNCTION(bar):
    FUNCTION(baz):
        for i in 1..10:
           print("Hello word")
def bar:
   def baz:
       for i in 1..10:
           print("Hello word")

А дальше придумаем такое:

define FUNCTION(name) {
    try:
}

define END {
   except Exception:
      log.error()
   finally:
      close()
}

и вот тут уже проблемы, потому что, ну допустим

FUNCTION(foo):
    print(1 / 0)
END

превратится в тыкву

def foo:
   try:
   print(1 / 0)  // УПС!!!
   except Exception:
      log.error()
   finally:
      close()