рдПрд░реНрд▓рд╛рдВрдЧ рдореЗрдВ рдЬрдмрд░рди рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ
рдПрд░рд▓рдВрдЧ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдПрдХ рдЕрдиреВрдареА рднрд╛рд╖рд╛ рд╣реИред рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рджрд╕ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрдкрдиреЗ рд▓рдЪреАрд▓реЗрдкрди рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрдорд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдПрдХ рдмрдбрд╝рд╛ "рдмреНрдпреВрдЯ" рд╣реИ рдЬреЛ рдПрд░реНрд▓рд╛рдВрдЧ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рднреНрд░рд╖реНрдЯ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдЬреЛ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрд░рд▓рдВрдЧ-рдЖрдзрд╛рд░рд┐рдд рд╕реАрдПрдордПрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдиреНрдп рдПрд░реНрд▓реИрдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЛ рдЗрд╕рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред
рдХрд╣рд╛рдБ рдФрд░ рдХрд╣рд╛рдБ?
рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ - рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдПрдХ рдореЗрдВ рдЕрдиреБрд╡рд╛рджред рдПрд░рд▓реИрдВрдЧ рдореЗрдВ рджреЛрдиреЛрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдХрд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╡реЗ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИрдВред
рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд░рд▓рд╛рдВрдЧ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рд╡реЗ рд╕рднреА is_ рдЙрдкрд╕рд░реНрдЧ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЧрд╛рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдпреЛрдлрд╝рд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП: рдЧрд╛рд░реНрдб рдПрдХ рдПрд░рд▓рд╛рдВрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
рд▓рд▓рд╛рдЯ рд╣рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
to_list(Item) when is_atom(Item)-> ...;
to_list(Item) when is_binary(Item)-> ...;
...
рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯ
рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рджреВрд╕рд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╣реА рдкрд░ рд▓рд╛рдПрдВред
рд▓реЗрдХрд┐рди рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рддреБрд▓рдирд╛рдПрдВ рдХрд░рдиреА рд╣реЛрдВрдЧреА, рдХрдо рд╕реЗ рдХрдо рдЖрд▓рд╕реНрдп рд╕реЗ рдЕрдзрд┐рдХ рдореБрдЭреЗ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ - рд▓рд╛рдЧреВ рдХрд░реЗрдВред
3 рдХреЗ рд╕рд╛рде рдпрд╣ рдлрд╝рдВрдХреНрд╢рди 3 (arity Erlang рд╢рдмреНрдж рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рдорд╛рдгреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рдорд╛рдгреБ, рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА, рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди - 2 рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ рд╕рдВрдШрд░реНрд╖ рд╕рдВрднрд╡ рд╣реИред
рдХреНрдпрд╛ рд╣реБрдЖ?
рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди, рдмрд▓, рдореВрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдореВрд▓ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдо рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
рд╕рд╛рде рд╣реА, рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрд╕рд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрддрд╛рдХреНрд╖рд░ рдЬреЛрдбрд╝реЗ рдЧрдПред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдРрд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рджрдмрд╛рд╡ рд╕рдВрднрд╡ рдирд╣реАрдВ рдереЗред рдЗрд╕рд▓рд┐рдП, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдбреЗрдЯрд╛ рдХреЛ рдкрд╣рд▓реЗ рд╕реВрдЪреА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдПред
рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрджрд┐рдо рд╣реИ:
force:to_list('this_is_a_long_atom')
рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
% ===================================================================================== % CMSaaS - Content Management System as a Service % % @copyright 2011 CMSaaS dev team % @version 0.1 % All rights reserved. % % CC-Attribution License % % Redistribution and use in source and binary forms, with or without modification, are permitted provided % that the following conditions are met: % % * Redistributions of source code must retain the above copyright notice, this list of conditions and the % following disclaimer. % * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and % the following disclaimer in the documentation and/or other materials provided with the distribution. % * Neither the name of the authors nor the names of its contributors may be used to endorse or promote % products derived from this software without specific prior written permission. % % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED % WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A % PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR % ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED % TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) % HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING % NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE % POSSIBILITY OF SUCH DAMAGE. % ===================================================================================== -module(force). -export([get_type/1, to_list/1, to_list/2, to_atom/1, to_atom/2, to_binary/1, to_binary/2, to_integer/1, to_integer/2, to_bitstring/1, to_bitstring/2, to_float/1, to_float/2, to_pid/1, to_pid/2, to_tuple/1, to_tuple/2]). force(Item, New_type) -> force(Item, New_type, []) . force(Item, New_type, Options) when is_list(Item)-> pass(Item, 'list', New_type, Options); force(Item, New_type, Options) when is_atom(Item)-> case New_type of 'list' -> pass(Item, 'atom', New_type, Options) ; 'binary' -> New_option=case Options of [] -> [utf8]; X -> X end, pass(Item, 'atom', New_type, New_option) ; _ -> pass(pass(Item, 'atom', 'list', []), 'list', New_type, Options) end ; force(Item, New_type, Options) when is_binary(Item)-> case New_type of 'atom' -> New_option=case Options of [] -> [utf8]; X -> X end, pass(Item, 'binary', New_type, New_option) ; 'list' -> pass(Item, 'binary', New_type, Options) ; _ -> pass(pass(Item, 'binary', 'list', Options), 'list', New_type, []) end ; force(Item, New_type, Options) when is_bitstring(Item)-> case New_type of 'list' -> pass(Item, 'bitstring', New_type, Options) ; _ -> pass(pass(Item, 'bitstring', 'list', []), 'list', New_type, Options) end ; force(Item, New_type, Options) when is_boolean(Item)-> case New_type of 'integer' -> pass(Item, 'boolean', New_type, Options) ; 'float' -> pass(Item, 'boolean', New_type, Options) ; _ -> pass(Item, 'atom', New_type, Options) end ; force(Item, New_type, Options) when is_float(Item)-> case New_type of 'list' -> pass(Item, 'float', New_type, Options) ; _ -> pass(pass(Item, 'float', 'list', []), 'list', New_type, Options) end ; force(Item, New_type, Options) when is_integer(Item)-> case New_type of 'list' -> pass(Item, 'integer', New_type, Options) ; _ -> pass(pass(Item, 'integer', 'list', []), 'list', New_type, []) end ; force(Item, New_type, Options) when is_pid(Item)-> pass(pass(Item, 'pid', 'list', []), 'list', New_type, Options) ; force(Item, New_type, Options) when is_port(Item)-> pass(pass(Item, 'port', 'list', []), 'list', New_type, Options) ; force(Item, New_type, Options) when is_reference(Item)-> pass(pass(Item, 'ref', 'list', []), 'list', New_type, Options) ; force(Item, New_type, Options) when is_tuple(Item)-> pass(pass(Item, 'tuple', 'list', []), 'list', New_type, Options) ; force(_Item, New_type, Options) -> pass(pass(undefined, 'atom', 'list', []), 'list', New_type, Options) . pass(Item, Old_type, New_type, _Options) when Old_type==New_type-> Item; pass(Item, Old_type, New_type, Options) -> apply(erlang, list_to_atom(atom_to_list(Old_type)++"_to_"++atom_to_list(New_type)), lists:merge([Item], Options)) . get_type(Item) when is_list(Item)-> 'list'; get_type(Item) when is_atom(Item)-> 'atom'; get_type(Item) when is_binary(Item)-> 'binary'; get_type(Item) when is_bitstring(Item)-> 'bitstring'; get_type(Item) when is_boolean(Item)-> 'atom'; get_type(Item) when is_float(Item)-> 'float'; get_type(Item) when is_integer(Item)-> 'integer'; get_type(Item) when is_pid(Item)-> 'pid'; get_type(Item) when is_port(Item)-> 'port'; get_type(Item) when is_reference(Item)-> 'ref'; get_type(Item) when is_tuple(Item)-> 'tuple'; get_type(_Item) -> undefined. to_list(Item) when is_list(Item) -> Item; to_list(Item) -> force(Item, 'list'). to_list(Item, _Options) when is_list(Item) -> Item; to_list(Item, Options) -> force(Item, 'list', Options). to_atom(Item) when is_atom(Item) -> Item; to_atom(Item) -> force(Item, 'atom'). to_atom(Item, _Options) when is_atom(Item) -> Item; to_atom(Item, Options) -> force(Item, 'atom', Options). to_binary(Item) when is_binary(Item) -> Item; to_binary(Item) -> force(Item, 'binary'). to_binary(Item, _Options) when is_binary(Item) -> Item; to_binary(Item, Options) -> force(Item, 'binary', Options). to_integer(Item) when is_integer(Item) -> Item; to_integer(Item) -> force(Item, 'integer'). to_integer(Item, _Options) when is_integer(Item) -> Item; to_integer(Item, Options) -> force(Item, 'integer', Options). to_bitstring(Item) when is_bitstring(Item) -> Item; to_bitstring(Item) -> force(Item, 'bitstring'). to_bitstring(Item, _Options) when is_bitstring(Item) -> Item; to_bitstring(Item, Options) -> force(Item, 'bitstring', Options). to_float(Item) when is_float(Item) -> Item; to_float(Item) -> force(Item, 'float'). to_float(Item, _Options) when is_float(Item) -> Item; to_float(Item, Options) -> force(Item, 'float', Options). to_pid(Item) when is_pid(Item) -> Item; to_pid(Item) -> force(Item, 'pid'). to_pid(Item, _Options) when is_pid(Item)-> Item; to_pid(Item, Options) -> force(Item, 'pid', Options). to_tuple(Item) when is_tuple(Item)-> Item; to_tuple(Item) -> force(Item, 'tuple'). to_tuple(Item, _Options) when is_tuple(Item)-> Item; to_tuple(Item, Options) -> force(Item, 'tuple', Options).