файлы рыскания и эрланга в ебине - PullRequest
3 голосов
/ 06 декабря 2010

У меня проблемы с целыми числами и числами с плавающей точкой в ​​сообщениях формы, и я получаю их в свой файл ebin, где у меня есть файлы лучей. Надеюсь, кто-нибудь может мне помочь.

npower.yaws

   <erl>
kv(K,L) ->
{value, {K, V}} = lists:keysearch(K,1,L), V.        
out(A) ->
L = yaws_api:parse_post(A),
N = kv("number", L),
    npower62:math3(N).
    </erl>

npower62.erl, скомпилированный в файл луча
модуль (npower62).
-export ([math3 / 1]).

math3 ([N]) ->
Число = N,
Nsquare = Число * Число,
{html, io_lib: format ("квадрат ~ c = ~ w", [N, Nsquare])}.

Дает мне квадрат 3 = 2601
вместо
квадрат 3 = 9
Я пытался использовать Number = list_to_integer (atom_to_list (N)) (не работает)
Я пытался использовать Number = list_to_float (atom_to_list (N)) (не работает)
я пытался использовать Number = list_to_integer (N) (не работает)

1 Ответ

0 голосов
/ 07 декабря 2010

Во-первых, вы можете сузить область действия, которую принимает ваша 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. Таким образом, вы бы с самого начала обнаружили, что это неправильно, уменьшая вашу путаницу.

...