Я имею в виду, как реализован такой метод, как is_list
(упомянутый выше)?
Используя erlang, вы можете реализовать is_list()
следующим образом:
-module(my).
-compile([export_all]).
islist([]) -> % empty list
true;
islist([_|_]) -> % non-empty list
true;
islist(_) -> % anything else
false.
Когда вы вызываете функцию, erlang начинается с первого предложения функции в определении и пытается соответствоватьаргументы, указанные в функции, вызывают параметры в определении функции.Если совпадения нет, erlang пытается выполнить следующее предложение функции.Когда совпадение найдено, выполняется соответствующее тело функции.Если ни одно из функциональных предложений не совпадает, вы получаете ошибку function_clause
.
В оболочке:
~/erlang_programs$ erl
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V6.4 (abort with ^G)
1> c(my).
{ok,my}
2> my:islist(3).
false
3> my:islist({1, 2}).
false
4> my:islist([1, 2]).
true
5> my:islist([]).
true
6> my:islist("abc").
true
В строке 6 вы должны знать, что "abc"
является сокращениемдля списка целых чисел [97, 98, 99]
.В erlang строка в двойных кавычках является сокращением для списка, который содержит целочисленные кодовые точки символов в строке в двойных кавычках.