0Pricing
Lua Academy · درس

التطبيق الجزئي

املأ وسيطات الدوال مسبقًا

التطبيق الجزئي درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

ما التطبيق الجزئي

يعني التطبيق الجزئي تثبيت بعض معاملات الدالة الآن وتوفير البقية لاحقًا. وتحصلون بذلك على دالة جديدة تحتاج إلى عدد أقل من المعاملات.

يتيح لكم هذا تحويل دالة عامة إلى دالة متخصصة عن طريق تثبيت القيم التي تعرفونها مسبقًا.

مثال يدوي

لنفترض أن لديكم دالة add. يمكنكم إنشاء addFive بكتابة إغلاق يلتقط القيمة 5 وينتظر العدد الثاني.

تبقى القيمة الملتقطة داخل الدالة المُرجعة، لذلك لا يحتاج كل استدعاء إلا إلى المعامل المتبقي.

local function add(a, b)
  return a + b
end

local function addFive(b)
  return add(5, b)
end

print(addFive(10))
print(addFive(2))

تثبيت المعامل الأول

يمكننا تعميم هذا النمط. يأخذ المساعد bind1 دالة ومعاملًا أول ثابتًا، ثم يُرجع دالة جديدة تتوقع المعامل الثاني.

يلتقط الإغلاق كلًا من f والقيمة المثبتة، ثم يمرر كل شيء عند استدعائه.

local function bind1(f, a)
  return function(b)
    return f(a, b)
  end
end

local function mul(x, y) return x * y end
local double = bind1(mul, 2)
print(double(7))
print(double(50))

استخدام المعاملات المتغيرة

لتثبيت أي عدد من المعاملات الأولى، استخدموا صياغة المعاملات المتغيرة في Lua، وهي .... التقطوا المعاملات الثابتة، ثم أضيفوا المعاملات اللاحقة وقت الاستدعاء.

تساعدكم الدالتان table.pack وtable.unpack على تخزين قوائم المعاملات ونشرها.

local function partial(f, ...)
  local fixed = table.pack(...)
  return function(...)
    local rest = table.pack(...)
    local args = {}
    for i = 1, fixed.n do args[i] = fixed[i] end
    for i = 1, rest.n do args[fixed.n + i] = rest[i] end
    return f(table.unpack(args, 1, fixed.n + rest.n))
  end
end

local function add3(a, b, c) return a + b + c end
local add10 = partial(add3, 10)
print(add10(2, 3))

تثبيت عدة معاملات

بما أن partial تقبل عددًا متغيرًا من المعاملات، يمكنكم تثبيت أكثر من معامل واحد دفعةً واحدة. عندها لا تحتاج الدالة المُعادة إلا إلى المعاملات المتبقية.

هنا، جرى ملء معاملين من أصل ثلاثة مسبقًا، فبقيت دالة تستقبل معاملًا واحدًا.

local function partial(f, ...)
  local fixed = table.pack(...)
  return function(...)
    local rest = table.pack(...)
    local args = {}
    for i = 1, fixed.n do args[i] = fixed[i] end
    for i = 1, rest.n do args[fixed.n + i] = rest[i] end
    return f(table.unpack(args, 1, fixed.n + rest.n))
  end
end

local function label(prefix, sep, value) return prefix .. sep .. value end
local tag = partial(label, "id", ":")
print(tag(42))

استخدام عملي

يبرز التطبيق الجزئي عند استخدام الدوال العامة المساعدة. ثبّتوا الإعداد مرة واحدة، ثم أعيدوا استخدام الدالة المتخصصة مرات عديدة.

في المثال أدناه، تصبح greet العامة دالة ترحيب بلغة ثابتة لا تحتاج إلا إلى اسم.

local function greet(lang, name)
  if lang == "tr" then return "Merhaba, " .. name end
  return "Hello, " .. name
end

local function bind1(f, a) return function(b) return f(a, b) end end
local greetTr = bind1(greet, "tr")
print(greetTr("Ada"))
print(greetTr("Lin"))

التطبيق الجزئي مقابل Currying

يحوّل Currying الدالة متعددة المعاملات إلى سلسلة من الدوال أحادية المعامل، بحيث تُعيد كل دالة منها الدالة التالية. أما التطبيق الجزئي فيثبّت بعض المعاملات فقط، ويُبقي استدعاء المعاملات المتبقية بصورته المعتادة.

المفهومان مرتبطان لكنهما مختلفان: يعمل Currying معاملًا واحدًا في كل مرة، بينما يثبّت التطبيق الجزئي بعض المعاملات الآن.

local function curryAdd(a)
  return function(b)
    return function(c)
      return a + b + c
    end
  end
end

print(curryAdd(1)(2)(3))

تطبيق Currying على دالة ذات معاملين

يمكن لدالة مساعدة صغيرة تطبيق Currying تلقائيًا على أي دالة ذات معاملين. فهي تُعيد دالة تستقبل المعامل الأول، وتُعيد بدورها دالة تستقبل المعامل الثاني.

ينتج عن ذلك دوال قابلة لإعادة الاستخدام، أحادية المعامل، وتبدو واضحة عند استخدامها في سلاسل المعالجة.

local function curry2(f)
  return function(a)
    return function(b)
      return f(a, b)
    end
  end
end

local function pow(base, exp) return base ^ exp end
local cpow = curry2(pow)
print(cpow(2)(10))

الإغلاقات تجعل ذلك ممكنًا

تعتمد كل دالة مطبَّق عليها تطبيق جزئي وكل دالة مطبَّق عليها Currying على الإغلاقات. فالمعاملات المثبّتة تكون متغيرات محلية ملتقطة تتذكرها الدالة المُعادة.

وبما أن لكل دالة مُعادة قيمها الملتقطة الخاصة، يمكنكم إنشاء العديد من النسخ المتخصصة بأمان.

local function bind1(f, a) return function(b) return f(a, b) end end
local function sub(x, y) return x - y end

local from100 = bind1(sub, 100)
local from10 = bind1(sub, 10)
print(from100(40))
print(from10(3))

متى تستخدمونه

استخدموا التطبيق الجزئي لتقليل التكرار عندما تستدعون دالة بالمعاملات الأولى نفسها مرارًا وتكرارًا.

ويساعدكم أيضًا على تكييف دالة مع واجهة تتوقع عددًا أقل من المعاملات، مثل دالة رد نداء لا تمرر إلا قيمة واحدة.

دوال رد النداء المُهيّأة

ينسجم التطبيق الجزئي جيدًا مع map وfilter. يمكنكم ملء معامل إعداد مسبقًا، بحيث لا تتلقى دالة رد النداء إلا عنصر القائمة.

يحافظ ذلك على نظافة سلسلة المعالجة، مع إتاحة ضبط السلوك حسب الحاجة.

local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function bind1(f, a) return function(b) return f(a, b) end end
local function scale(factor, x) return factor * x end

local r = map({1,2,3,4}, bind1(scale, 10))
print(table.concat(r, ", "))

تحقق سريع

تذكّروا الفرق بين فكرتين مرتبطتين.

مراجعة

يثبّت التطبيق الجزئي بعض المعاملات ويُعيد دالة جديدة تتوقع المعاملات المتبقية، ويُبنى ذلك باستخدام الإغلاقات التي تلتقط القيم المثبّتة.

تعمّم الدالة المساعدة partial القائمة على عدد متغير من المعاملات هذا الأسلوب، بينما يربط Currying الدوال أحادية المعامل في سلسلة. ويقلل كلا الأسلوبين التكرار ويكيّفان الدوال مع دوال رد النداء.

الأسئلة الشائعة

هل درس «التطبيق الجزئي» مجاني؟

نعم — نص درس «التطبيق الجزئي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «التطبيق الجزئي»؟

املأ وسيطات الدوال مسبقًا تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «التطبيق الجزئي»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الدوال بوصفها قيمًا
  2. map وfilter وreduce
  3. التطبيق الجزئي
  4. تركيب الدوال
← العودة إلى Lua Academy