Во-первых, вы можете сузить область действия, которую принимает ваша math3/1
функция:
-module(npower62).
-export([math3/1]).
math3(N) when is_number(N) ->
N2 = N * N,
io_lib:format("square of ~p = ~p", [N, N2]).
Заметьте, мы переписали функцию совсем немного. Он больше не принимает список, но любое число, только N
. Кроме того, строка формата, которую вы передали io_lib:format/2
, была полностью отключена, см. man -erl io
.
Теперь мы можем атаковать код рыскания:
<erl>
kv(K,L) ->
proplists:get_value(K, L, none).
out(A) ->
L = yaws_api:parse_post(A),
N = kv("number", L),
none =/= N, %% Assert we actually got a value from the kv lookup
%% Insert type mangling of N here so N is converted into an Integer I
%% perhaps I = list_to_integer(N) will do. I don't know what type parse_post/1
%% returns.
{html, npower62:math3(I)}
</erl>
Обратите внимание, что ваша функция kv/2
может быть написана с помощью функции поиска проплистов. В вашем варианте кода возвращением из kv/2
было значение {value, {K, V}}
, которое никогда не будет правильным в вашей версии math3/1
. proplists:get_value/3
возвращает только часть V
. Также обратите внимание, что я поднял {html, ...} до этого уровня. Это плохой стиль, чтобы позволить npower62 справиться с этим, поскольку он ничего не должен знать о том факте, что он вызывается изнутри.
My думаю, - вам нужно вызвать list_to_integer (N). Самый простой способ выяснить это - воспользоваться вызовом error_logger:info_report([{v, N}])
, найти ИНФОРМАЦИОННЫЙ ОТЧЕТ в оболочке или в файле журнала и посмотреть, что такое термин N.
TL; DR: проблема в том, что ваши значения не совпадают повсюду. Таким образом, вы столкнулись с многочисленными сбоями функции, которая, вероятно, ловит рыбу, регистрирует и затем выживает. Это вас смущает без конца.
Кроме того, проверьте свою функцию npower62:math3/1
функцию из оболочки erl
. Таким образом, вы бы с самого начала обнаружили, что это неправильно, уменьшая вашу путаницу.