আমি একটি কল করার চেষ্টা করছি Shapeless
ভিতরে থেকে ম্যাক্রো quasiquote
সঙ্গে Scala
এবং আমি হচ্ছিনা আমি পেতে চাই কি।
আমার ম্যাক্রো কোনো ত্রুটি ফেরত দেয় না কিন্তু এটি প্রসারিত না Witness(fieldName)
বাWitness.Lt[String]
val implicits = schema.fields.map { field =>
val fieldName:String = field.name
val fieldType = TypeName(field.valueType.fullName)
val in = TermName("implicitField"+fieldName)
val tn = TermName(fieldName)
val cc = TermName("cc")
q"""implicit val $in = Field.apply[$className,$fieldType](Witness($fieldName), ($cc: $className) => $cc.$tn)"""
}
এখানে আমার Field
সংজ্ঞা:
sealed abstract class Field[CC, FieldName] {
val fieldName: String
type fieldType
// How to extract this field
def get(cc : CC) : fieldType
}
object Field {
// fieldType is existencial in Field but parametric in Fied.Aux
// used to explict constraints on fieldType
type Aux[CC, FieldName, fieldType_] = Field[CC, FieldName] {
type fieldType = fieldType_
}
def apply[CC, fieldType_](fieldWitness : Witness.Lt[String], ext : CC => fieldType_) : Field.Aux[CC, fieldWitness.T, fieldType_] =
new Field[CC, fieldWitness.T] {
val fieldName : String = fieldWitness.value
type fieldType = fieldType_
def get(cc : CC) : fieldType = ext(cc)
}
}
এক্ষেত্রে আমি উত্পন্ন উত্থাপিত চেহারাগুলির মতো দেখতে:
implicit val implicitFieldname : Field[MyCaseClass, fieldWitness.`type`#T]{
override type fieldType = java.lang.String
}
এটির বাইরে যদি এটি সংজ্ঞায়িত করা হত quasiquote
তবে এটি এমন কিছু উত্পন্ন করবে:
implicit val implicitFieldname : Field.Aux[MyCaseClass, Witness.Lt[String]#T, String] = ...
এমন কিছু আছে যা করা যায়?
q"""implicit val $in : Field.Aux[$className, Witness.Lt[String]#T, String] = Field.apply[$className,$fieldType](Witness($fieldName), ($cc: $className) => $cc.$tn)"""
ConstantType
)। আপনার চারপাশে একটি সম্পূর্ণ কাজের উদাহরণ রয়েছে?
$in
(যা আমি মনে করি ব্যবহার করার প্রয়োজন হবেConstantType
) এর জন্য কোনও ধরণের টিকা প্রদানের চেষ্টা করেছেন ?