У функций Elixir есть максимум airty? - PullRequest
2 голосов
/ 08 мая 2019

Существует ли верхний предел количества аргументов, которые может принять функция? Это не считается сопоставлением с образцом. Например. функция, определенная как fn ([arg1, arg2, arg3], arg4), считается только как 2.

Если нет верхнего предела, поддерживает ли Elixir также функции с переменными числами?

Ответы [ 2 ]

8 голосов
/ 08 мая 2019

Эликсир бежит поверх Эрланга, для которого максимальная арность кажется равной 255 Смотрите эту страницу: http://erlang.org/doc/reference_manual/typespec.html и найдите таблицу, содержащую строку: arity() 0..255

Подтверждающее обновление: Попытка скомпилировать функцию с 255 параметрами работает.

Попытка компилировать функцию с 256 параметрами приводит к следующей ошибке компиляции:

== Compilation error in file arity.ex ==
** (CompileError) arity.ex:3: too many arguments (256) - maximum allowed is 255
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
** (CompileError)  compile error
    (iex) lib/iex/helpers.ex:183: IEx.Helpers.c/2

Тест выполнен в Elixir Shell для Windows10 x64 с использованием c "arity.ex", где содержание arity.ex (плюс или минус параметр) равно:

defmodule Test do
 def arity(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, p41, p42, p43, p44, p45, p46, p47, p48, p49, p50, p51, p52, p53, p54, p55, p56, p57, p58, p59, p60, p61, p62, p63, p64, p65, p66, p67, p68, p69, p70, p71, p72, p73, p74, p75, p76, p77, p78, p79, p80, p81, p82, p83, p84, p85, p86, p87, p88, p89, p90, p91, p92, p93, p94, p95, p96, p97, p98, p99, p100, p101, p102, p103, p104, p105, p106, p107, p108, p109, p110, p111, p112, p113, p114, p115, p116, p117, p118, p119, p120, p121, p122, p123, p124, p125, p126, p127, p128, p129, p130, p131, p132, p133, p134, p135, p136, p137, p138, p139, p140, p141, p142, p143, p144, p145, p146, p147, p148, p149, p150, p151, p152, p153, p154, p155, p156, p157, p158, p159, p160, p161, p162, p163, p164, p165, p166, p167, p168, p169, p170, p171, p172, p173, p174, p175, p176, p177, p178, p179, p180, p181, p182, p183, p184, p185, p186, p187, p188, p189, p190, p191, p192, p193, p194, p195, p196, p197, p198, p199, p200, p201, p202, p203, p204, p205, p206, p207, p208, p209, p210, p211, p212, p213, p214, p215, p216, p217, p218, p219, p220, p221, p222, p223, p224, p225, p226, p227, p228, p229, p230, p231, p232, p233, p234, p235, p236, p237, p238, p239, p240, p241, p242, p243, p244, p245, p246, p247, p248, p249, p250, p251, p252, p253, p254, p255, p256 ) do 
  IO.puts( "hello world" )
 end
end
0 голосов
/ 20 мая 2019

Если верхнего предела нет, поддерживает ли Elixir функции с переменными числами?

Beam не поддерживает функции с переменными числами.Это унаследовано от Пролога на самом деле.

Эликсиру удается подделать его, создав вторую функцию, которая вызывает первую, поэтому возьмем этот пример.Если вы посмотрите на скомпилированный код, вы обнаружите, что есть 2 функции count/1 и count/2

def count(start , end \\ 10), do: ... 

Если бы вы декомпилировали его, вы бы нашли код вроде этого

def count(start), do: count(start, 10)
def count(start, end), do: ...
...