D - Programmable block statements.
- anderson (35/35) Jan 20 2003 Yet again, another idea.
- Mike Wynn (22/57) Jan 20 2003 use an auto class
- Mike Wynn (90/90) Jan 20 2003 an example ....
- Scott Pigman (2/9) Jan 20 2003 i second this.
- Paul Stanton (11/11) Jan 20 2003 a nice idea: improves readability by ensuring variables fall out of scop...
- Paul Stanton (1/1) Jan 20 2003 ok, i missed the point
- Patrick Down (35/87) Jan 20 2003 Ruby has a syntax that is similar to this. In Ruby
- Mark Evans (4/4) Jan 20 2003 The Oz book covers such material. What you are talking about relates to...
Yet again, another idea. I think it would be cool if you could program your own block statements. Often you need to have open/close statements (like with files). If you can force the user to call them in a certain order using programmable block statements, I think it would save a lot of bugs. Of course the idea I present here is only a prototype. Class ABC { void open(char * FileName, block Enter) { if (Enter) { ... } else { ... } } } ... ABC x; x.open("filename") { } //Closes here You could also handle return types (if it had one). V would only be returned after open (enter) had completed. v = x.open("filename") { } //Closes here And you could also use the function as-per-normal where block = boolean. x.open("filename", true) x.open("filename", false) PS - I would suppose there were lots of ways of syntax'ing this, I tried to choose an easily phaseable one.
Jan 20 2003
use an auto class File f; if ( f = open() ) { auto FileCloser = new FileCloser( f ); // closes here; } // I've not checked but you should be able to do; auto class File { } whatever func( char[] name ) { char [] fullname = getFulName( name, cwd() ); { // braces SHOULD create a new scope (as in C) auto MyFile = new MyFile( fullname ); ... stuff ... // will close here } } "anderson" <anderson badmama.com.au> wrote in message news:b0ica3$21sj$1 digitaldaemon.com...Yet again, another idea. I think it would be cool if you could program your own block statements. Often you need to have open/close statements (like with files). If you can force the user to call them in a certain order using programmable block statements, I think it would save a lot of bugs. Of course the idea I present here is only a prototype. Class ABC { void open(char * FileName, block Enter) { if (Enter) { ... } else { ... } } } ... ABC x; x.open("filename") { } //Closes here You could also handle return types (if it had one). V would only bereturnedafter open (enter) had completed. v = x.open("filename") { } //Closes here And you could also use the function as-per-normal where block = boolean. x.open("filename", true) x.open("filename", false) PS - I would suppose there were lots of ways of syntax'ing this, I triedtochoose an easily phaseable one.
Jan 20 2003
an example .... pity you can't `with` an auto then main could be int main( char[][] args ) { MyFile res; printf("Starting ...\n"); with( new Closer( new closer.MyBlock( &closeIt, 3, res ) ) ) { printf("[doing stuff]\n"); } printf("end.\n"); return 0; } almost exactly what you are after. ---------------------------- import c.stdio; interface Closes { bit close(); } // work around because you can't have a destructor in a templated class auto class Closer { Closes toClose; this( Closes toClose0 ) { toClose = toClose0; } ~this() { toClose.close(); } } template delegatehelper( P, RV, T : RV (*)( P ) ) { class FcHelper { T toCall; this( T funcPtr ) { toCall = funcPtr; } RV evoke( P param ) { return toCall( param ); } } } template autocloser( T, P ) { // auto class MyBlock class MyBlock : Closes { alias bit delegate ( T ) closeDelegate; alias bit (*closeFuncPtr)( T ); closeDelegate onClose; T item; /* this( closeDelegate close0, P param, out T made ) { init( close0, param, made ); }*/ this( closeFuncPtr close0, P param, out T made ) { instance delegatehelper( T, bit, closeFuncPtr ) dh; dh.FcHelper conv = new dh.FcHelper( close0 ); init( &conv.evoke, param, made ); } void init( closeDelegate close0, P param, out T made ) { made = item = new T( param ); onClose = close0; } /* ~this() { // onClose( item ); }*/ bit close() { return onClose( item ); } } } class MyFile { int i; this( int ii ) { i = ii; printf( "OPEN(%d)\n", i ); } } bit closeIt( MyFile f ) { printf( "CLOSE\n" ); return true; } instance autocloser( MyFile, int ) closer; int main( char[][] args ) { MyFile res; printf("Starting ...\n"); { auto Closer autoClose = new Closer( new closer.MyBlock( &closeIt, 3, res ) ); printf("[doing stuff]\n"); } printf("end.\n"); return 0; }
Jan 20 2003
Close, but not quite. With that technique you need to create an object each time you want this ability. But I get your point about it almost being in the language. Another point with that example is that it's weakly defined (in reguards to using bracks or not) , because the users won't be force into using the brake scope, which is an the idea I put forth. "Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:b0ih2k$24c9$1 digitaldaemon.com...an example .... pity you can't `with` an auto then main could be int main( char[][] args ) { MyFile res; printf("Starting ...\n"); with( new Closer( new closer.MyBlock( &closeIt, 3, res ) ) ) { printf("[doing stuff]\n"); } printf("end.\n"); return 0; } almost exactly what you are after. ---------------------------- import c.stdio; interface Closes { bit close(); } // work around because you can't have a destructor in a templated class auto class Closer { Closes toClose; this( Closes toClose0 ) { toClose = toClose0; } ~this() { toClose.close(); } } template delegatehelper( P, RV, T : RV (*)( P ) ) { class FcHelper { T toCall; this( T funcPtr ) { toCall = funcPtr; } RV evoke( P param ) { return toCall( param ); } } } template autocloser( T, P ) { // auto class MyBlock class MyBlock : Closes { alias bit delegate ( T ) closeDelegate; alias bit (*closeFuncPtr)( T ); closeDelegate onClose; T item; /* this( closeDelegate close0, P param, out T made ) { init( close0, param, made ); }*/ this( closeFuncPtr close0, P param, out T made ) { instance delegatehelper( T, bit, closeFuncPtr ) dh; dh.FcHelper conv = new dh.FcHelper( close0 ); init( &conv.evoke, param, made ); } void init( closeDelegate close0, P param, out T made ) { made = item = new T( param ); onClose = close0; } /* ~this() { // onClose( item ); }*/ bit close() { return onClose( item ); } } } class MyFile { int i; this( int ii ) { i = ii; printf( "OPEN(%d)\n", i ); } } bit closeIt( MyFile f ) { printf( "CLOSE\n" ); return true; } instance autocloser( MyFile, int ) closer; int main( char[][] args ) { MyFile res; printf("Starting ...\n"); { auto Closer autoClose = new Closer( new closer.MyBlock( &closeIt, 3, res ) ); printf("[doing stuff]\n"); } printf("end.\n"); return 0; }
Jan 20 2003
if you could use an auto class with `with` it's almost there, in your example you use one method with a bool param to say open or close the with way with( new MyAutoObject( params ) ) { // constructor called ... do stuff ... } /// ~this (destructor called) does everything you want, no syntax changes, no special cases. as for creating an object every time, well D is a OO lang. I don't know if they are, but auto objects could be stack allocated so there is no overhead createing the space (just sub sp, (sizeof(locals)+sizeof(autos)) in the function prolog.) if your class only have methods and no members or few members its no great overhead. its basically the same technique C++ programmers have used for years, with Lock and smart pointer classes only C++ template syntax is a bit less verbose; "anderson" <anderson badmama.com.au> wrote in message news:b0ikm4$262l$1 digitaldaemon.com...Close, but not quite. With that technique you need to create an objecteachtime you want this ability. But I get your point about it almost being in the language. Another point with that example is that it's weakly defined (in reguardstousing bracks or not) , because the users won't be force into using thebrakescope, which is an the idea I put forth.
Jan 20 2003
On Tue, 21 Jan 2003 10:50:41 +0800, anderson wrote:Yet again, another idea. I think it would be cool if you could program your own block statements. Often you need to have open/close statements (like with files). If you can force the user to call them in a certain order using programmable block statements, I think it would save a lot of bugs.i second this.
Jan 20 2003
a nice idea: improves readability by ensuring variables fall out of scope when no longer needed therefore allowing the reader to disregard such properties (which can also be achieved by writing a method somewhere else, but if your sure you arnt gonna use it again, whats the point?). basically, by doing this, you are saying "everything between "{" and "}" is only required for [insert purpose here]. But this is not such a new idea, and can be easily achieved syntaxically in current languages. You can use "{" and "}" anywhere you like, they are "scope" parenthesis, therefore, anything defined inside, will fall out of scope when exited. You can already program yr own block statements
Jan 20 2003
Ruby has a syntax that is similar to this. In Ruby you could use the following program to write each line in a file. File.open("name","r") do |aFile| aFile.each_line() do |aLine| puts aLine end end open might be defined like this def File.open(name,mode) aFile = File.new(name,mode) yield aFile aFile.close() end In principal I like the idea. From an implementaion standpoint the block that follows the function is really just an anonymous function; Anonymous functions have already been suggested. void Func(int b, int (*fp)(int)); Func(12,anon(a){ return a*a;}); Perhaps if the last parameter in a functions parmeter list was a function pointer the anonymous function could be specified after the ')'. Func(12) anon(a) { return a*a; } This would make the anonymous function look a little cleaner if it was more than a couple of lines long. "anderson" <anderson badmama.com.au> wrote in news:b0ica3$21sj$1 digitaldaemon.com:Yet again, another idea. I think it would be cool if you could program your own block statements. Often you need to have open/close statements (like with files). If you can force the user to call them in a certain order using programmable block statements, I think it would save a lot of bugs. Of course the idea I present here is only a prototype. Class ABC { void open(char * FileName, block Enter) { if (Enter) { ... } else { ... } } } ... ABC x; x.open("filename") { } //Closes here You could also handle return types (if it had one). V would only be returned after open (enter) had completed. v = x.open("filename") { } //Closes here And you could also use the function as-per-normal where block = boolean. x.open("filename", true) x.open("filename", false) PS - I would suppose there were lots of ways of syntax'ing this, I tried to choose an easily phaseable one.
Jan 20 2003
The Oz book covers such material. What you are talking about relates to the dataflow paradigm and also to threads. Oz has a whole raft of capability relating to threads, distributed stores that appear as one, etc. Mark
Jan 20 2003