يمكن أن تسجل تعميمها التحديثات الميدانية في لغة كامل الموضوعية؟

StackOverflow https://stackoverflow.com/questions/215770

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا لغة كامل الموضوعية مبرمج مبتدئ جدا لذا يرجى أن يغفر لي إذا كان هذا هو / السؤال الذي يطرح نفسه غبي. هناك <م> الكثير لاستيعاب وربما أكون قد غاب عن هذا في الوثائق.

ولدي قاعدة من التعليمات البرمجية ذلك بدأ تبدو مثل هذا:

let update_x p x =
  add_delta p;
  p.x <- x;
  refresh p

let update_y p y =
  add_delta p;
  p.y <- y;
  refresh p

let update_z p z =
  add_delta p;
  p.z <- z;
  refresh p 

ووالازدواجية هو بداية لعلة لي لأنني <م> تريد أن أكتب شيئا من هذا القبيل:

let update_scalar p scalar value =
    add_delta p;
    magic_reflection (p, scalar) <- value;
    refresh p

وهذه الطريقة عندما أقوم بتحديث س يمكن أن أدعو ببساطة:

update_scalar p 'x' value

وهذا يستدعي من "وحدات الماكرو!" بالنسبة لي ولكن لا أعتقد أن لغة كامل الموضوعية لديها نظام الكلي. ماذا يمكنني أن أفعل؟

هل كانت مفيدة؟

المحلول

لا، أنت لا تستطيع أن تفعل ما تريد في سهل لغة كامل الموضوعية. هل يمكن أن يكتب تمديد تركيب مع camlp4 (والذي هو نوع من نظام الكلي، على الرغم من نوع مختلف من أنك ربما اعتادوا على) من شأنها أن تغير

UPDATE_FIELD x f y

في

x.f <- y

وبدلا من ذلك، هل يمكن أن الاشياء الأمور في جدول تجزئة والتخلي عن سلامة النوع.

ملحوظة: إصدار camlp4 المدرجة في لغة كامل الموضوعية الإصدار 3.10 و في وقت لاحق يختلف ويتعارض مع الإصدار السابق. للحصول على معلومات حول أحدث إصدار، انظر موقع تعليمي لغة كامل الموضوعية .

نصائح أخرى

وأنت لا تستطيع أن تفعل تماما ما تريد، ولكن هل يمكن أن تقلل إلى حد كبير من النمطي مع الوظائف العليا:

let update_gen set p x =
  add_delta p;
  set p x;
  refresh p

let update_x = update_gen (fun p v -> p.x <- v)
let update_y = update_gen (fun p v -> p.y <- v)
let update_z = update_gen (fun p v -> p.z <- v)

ولغة كامل الموضوعية لديها نظام الكلي (camlp4)، وأنه لا يسمح لك أن تنفيذ هذا النوع من الشيء، مع بعض العمل.

وكما ذكر أعلاه لغة كامل الموضوعية لديها نظام الكلي. ولهذه المهمة هو مطلوب فقط جزء صغير منه:

open Printf

type t = { mutable x : float; mutable y : float; mutable z : float; mutable t : int; }

let add_delta p = p.t <- p.t + 1
let refresh p = printf "%d) %.2f %.2f %.2f\n" p.t p.x p.y p.z

DEFINE UPD(x) = fun p v ->
  add_delta p;
  p.x <- v;
  refresh p

let update_x = UPD(x)
let update_y = UPD(y)
let update_z = UPD(z)

let () =
  let p = { x = 0.; y = 0.; z = 0.; t = 0; } in
  update_x p 0.1;
  update_y p 0.3;
  update_z p 2.0

وترجمة مع:

ocamlfind ocamlc -package camlp4.macro -syntax camlp4o q.ml -o q

واطلع على الشفرة التي تم إنشاؤها مع:

camlp4o Camlp4MacroParser.cmo q.ml
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top