2017-01-17 4 views
1

Я написал макрос для сравнения два строки, как следоватьошибки в программе, сравнивая две строки в макросе в Эрл

-module(helloworld). 
-export([start/0]). 
-define(macro1(X,Y),{if X == Y -> "True"; true ->"False" end.}). 

start() -> 
    io:fwrite("~w",[?macro1("str","str")]). 

получает ошибку следующим образом:

Compiling the source code.... 
$erlc helloworld.erl 2>&1 
helloworld.erl:6: syntax error before: '.' 
helloworld.erl:2: function start/0 undefined 

ответ

4

Macro не как функции определение. Препроцессор просто заменяет строку. поэтому в вашем случае вам нужно удалить точку в фигурном кронштейне:

-define(macro1(X,Y),{if X == Y -> "True"; true ->"False" end}). 
+0

Я бы добавил, что показывает, что код в вопросе расширяется. –

+0

Выше изменение разм. Кода закончилось ошибкой .. helloworld.erl: 5: Предупреждение: этот раздел не может совпадать, поскольку предыдущее предложение в строке 5 всегда соответствует –

+1

Это не ошибка, а предупреждение. Как я уже сказал, макрос создает замену строки, поэтому вы теперь компилируете код, в котором результат 'X == Y' всегда истинен, так как X и Y заменяются на« str ». Компилятор предупреждает вас, что второе предложение if никогда не будет выполнено. Если вы измените определение 'start() -> io: fwrite (" ~ w ", [? Macro1 (" str "," str ")]).' By 'start (X) -> io: fwrite (" ~ w ", [? macro1 (X," str ")]).', у вас не будет предупреждения, поскольку каждое условие может соответствовать в зависимости от значения X. – Pascal