| Thread overview | ||||||
|---|---|---|---|---|---|---|
|
May 23, 2014 Using custom attribute for a general parser. Is possible in D ? | ||||
|---|---|---|---|---|
| ||||
I bask originally this qustion in this thread : http://forum.dlang.org/post/rsnswykpjfzenplivkhm@forum.dlang.org but another thread is better as that is not exactly same topic. I would like to use custom annotate/attribute on members as: struct A { @Parser( start = "( word ) => word[0] == '>'", end = "( word ) => word[0] == '\n'" ) string header; } but it seem we can't use curstom annotation in D and mxin in this case are not easy. This custom attribute is a metadata to explain how to retrieve this field from a file. This will aloow to create a global parser and give to this parrser data structure to get back. Parser could to b an input range were hront give currentfilled struct and popfront will look foward in buffer given by file.byChunk() using this metadata. When all field are filled give the instance to front … | ||||
May 23, 2014 Re: Using custom attribute for a general parser. Is possible in D ? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to bioinfornatics | On Friday, 23 May 2014 at 15:17:52 UTC, bioinfornatics wrote: > I bask originally this qustion in this thread : > http://forum.dlang.org/post/rsnswykpjfzenplivkhm@forum.dlang.org > > but another thread is better as that is not exactly same topic. > > > I would like to use custom annotate/attribute on members as: > > > struct A > { > @Parser( > start = "( word ) => word[0] == '>'", > end = "( word ) => word[0] == '\n'" ) > string header; > > } > > > but it seem we can't use curstom annotation in D and mxin in this > case are not easy. > > This custom attribute is a metadata to explain how to retrieve > this field from a file. This will aloow to create a global parser > and give to this parrser data structure to get back. > Parser could to b an input range were > hront give currentfilled struct and popfront will look foward in > buffer given by file.byChunk() using this metadata. > When all field are filled give the instance to front … Sorry for typos they are severals. So to continue te code below is more close to D but do not build: import std.stdio; struct attribute { } @attribute struct section { bool delegate( string ) start; bool delegate( string ) end; this( in bool delegate( string ) start, in bool delegate( string ) end) { this.start = start, this.end = end; } } struct A { @section( ( word ) => word[0] == '@', ( word ) => word[0] == '\n') int a; } int main(string[] args) { A a; return 0; } testCustomAttributes.d(43): Error: delegate testCustomAttributes.A.__lambda2!(string).__lambda2 function literals cannot be class members | |||
May 26, 2014 Re: Using custom attribute for a general parser. Is possible in D ? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to bioinfornatics | On 05/23/2014 09:09 AM, bioinfornatics wrote:
> struct A {
> @section( ( word ) => word[0] == '@', ( word ) =>
> word[0] == '\n')
> int a;
> }
I was able to make that work if I used function instead of delegate:
import std.stdio;
struct attribute { }
alias MatchFunc = bool function( string );
@attribute
struct section {
MatchFunc start;
MatchFunc end;
this( in MatchFunc start,
in MatchFunc end)
{
this.start = start,
this.end = end;
}
}
struct A {
@section((string word) => word[0] == '@',
(string word) => word[0] == '\n')
int a;
}
import std.traits;
void main()
{
auto aa = A();
auto t = __traits(getAttributes, A.a);
foreach (sect; t) {
auto start_result = sect.start("@test");
auto end_result = sect.end("\n");
writefln("Results: %s and %s", start_result, end_result);
}
}
Ali
| |||
May 26, 2014 Re: Using custom attribute for a general parser. Is possible in D ? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Monday, 26 May 2014 at 19:50:29 UTC, Ali Çehreli wrote:
> On 05/23/2014 09:09 AM, bioinfornatics wrote:
>
> > struct A {
> > @section( ( word ) => word[0] == '@', ( word ) =>
> > word[0] == '\n')
> > int a;
> > }
>
> I was able to make that work if I used function instead of delegate:
>
> import std.stdio;
>
> struct attribute { }
>
> alias MatchFunc = bool function( string );
>
> @attribute
> struct section {
> MatchFunc start;
> MatchFunc end;
>
> this( in MatchFunc start,
> in MatchFunc end)
> {
> this.start = start,
> this.end = end;
> }
> }
>
> struct A {
> @section((string word) => word[0] == '@',
> (string word) => word[0] == '\n')
> int a;
> }
>
> import std.traits;
>
> void main()
> {
> auto aa = A();
> auto t = __traits(getAttributes, A.a);
>
> foreach (sect; t) {
> auto start_result = sect.start("@test");
> auto end_result = sect.end("\n");
>
> writefln("Results: %s and %s", start_result, end_result);
> }
> }
>
> Ali
thanks Ali nice works as usual :-)
it seem delegate will be suppoted into dmdfe 2.066
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply