Thread: [cedet-eieio] Newbie: Old methods hanging around when refactoring code
Brought to you by:
zappo
From: Syver E. <syv...@on...> - 2002-12-08 08:09:59
|
When I refactor my code old methods from the class I am working on keep hanging around. I am getting tired of exiting emacs every five minutes to be sure that what I see is what I get when testing. Any tips, hints? -- Vennlig hilsen Syver Enstad |
From: Eric M. L. <er...@si...> - 2002-12-08 14:59:05
|
>>> Syver Enstad <syv...@on...> seems to think that: > >When I refactor my code old methods from the class I am working on >keep hanging around. I am getting tired of exiting emacs every five >minutes to be sure that what I see is what I get when testing. Any >tips, hints? Hi, EIEIO has a memoizing dispatcher, and there are no un-binding functions that will go through the method hash table to delete old calling trails. I think some code like this can wipe out old methods though: (fset 'dead-method nil) (put eieio-method-obarray nil) but that is a pretty heavy hammer if you have other classes using that method. Good Luck Eric -- Eric Ludlam: za...@gn..., er...@si... Home: http://www.ludlam.net Siege: www.siege-engine.com Emacs: http://cedet.sourceforge.net GNU: www.gnu.org |
From: Syver E. <syv...@on...> - 2002-12-10 13:32:33
|
"Eric M. Ludlam" <er...@si...> writes: > I think some code like this can wipe out old methods though: > > (fset 'dead-method nil) > (put eieio-method-obarray nil) > > but that is a pretty heavy hammer if you have other classes using > that method. I tried using this snippet, based on what you wrote. I think it was too heavy a hammer because I wasn't able to get them back again when I evaluated the buffer afterwards. You don't wear a somewhat lighter hammer do you? :-) Actually it's a bit of a shame because when the inability to delete methods means that my strategy of loading test-case objects based on introspecting their methods won't work because methods that I have removed from the source code still hangs around. (mapcar (lambda (each) (fset each nil) (put each 'eieio-method-obarray nil)) (eieio-all-generic-functions 'test-case-test)) -- Vennlig hilsen Syver Enstad |
From: Eric M. L. <er...@si...> - 2002-12-08 15:25:32
|
>>> "Eric M. Ludlam" <er...@si...> seems to think that: >>>> Syver Enstad <syv...@on...> seems to think that: >> >>When I refactor my code old methods from the class I am working on >>keep hanging around. I am getting tired of exiting emacs every five >>minutes to be sure that what I see is what I get when testing. Any >>tips, hints? > >Hi, > > EIEIO has a memoizing dispatcher, and there are no un-binding > functions that will go through the method hash table to delete old > calling trails. > > I think some code like this can wipe out old methods though: > >(fset 'dead-method nil) >(put eieio-method-obarray nil) [ ... ] Oops, forgot my `put' syntax. Try this insead: (put 'dead-method 'eieio-method-obarray nil) Eric -- Eric Ludlam: za...@gn..., er...@si... Home: http://www.ludlam.net Siege: www.siege-engine.com Emacs: http://cedet.sourceforge.net GNU: www.gnu.org |
From: Eric M. L. <er...@si...> - 2002-12-09 02:08:50
|
> Thanks I'll look into it. I decided to port Kent Beck's xUnit (Unit > testing framework) as a project to help me learn more about elisp and > eieio. I already have a simple port finished, but I'd like to know how to > enumerate the methods of a class, given the class. > > Pseudo code: > > testMethods = [] > for method in class: > if method.asString().beginsWith('test-'): > testMethods.append(method) > That might look like this: (let ((methods (eieio-all-generic-functions 'yourclasshere))) (while methods (if (string-match "^test-" (symbol-string (car methods))) (funcall (car methods) yourobject other-param)) (setq methods (cdr methods)))) Good Luck. I'll have to try our your new program. Eric -- Eric Ludlam: za...@gn..., er...@si... Home: http://www.ludlam.net Siege: www.siege-engine.com Emacs: http://cedet.sourceforge.net GNU: www.gnu.org |
From: Syver E. <syv...@on...> - 2002-12-09 10:47:56
|
"Eric M. Ludlam" <er...@si...> writes: > That might look like this: > > (let ((methods (eieio-all-generic-functions 'yourclasshere))) > (while methods > (if (string-match "^test-" (symbol-string (car methods))) > (funcall (car methods) yourobject other-param)) > (setq methods (cdr methods)))) > > Good Luck. I'll have to try our your new program. Thanks Eric, that looks very much like what I want. I'll fix up my test-loader class so that it can instantiate test-case's from all methods prefixed with test-. I'll post updates here when I am through. -- Vennlig hilsen Syver Enstad |
From: Eric M. L. <er...@si...> - 2002-12-11 04:01:50
|
>>> Syver Enstad <syv...@on...> seems to think that: >> "Eric M. Ludlam" <er...@si...> writes: >> >> > That might look like this: >> > >> > (let ((methods (eieio-all-generic-functions 'yourclasshere))) >> > (while methods >> > (if (string-match "^test-" (symbol-string (car methods))) >> > (funcall (car methods) yourobject other-param)) >> > (setq methods (cdr methods)))) >> > >> > Good Luck. I'll have to try our your new program. > >Here it is. You should be able to see what it does by the tests. > >Btw, I found out how to "clean" up the methods. > >(defun clean () > "Now it works" > (mapcar (lambda (each) > (put each 'eieio-method-obarray nil)) > (eieio-all-generic-functions 'test-case-test)) >) Aha, I see how that would work. Based on this, I've tentatively added this function to EIEIO for the next point release. I'm not sure I like the name much. Enjoy. Eric (defun eieio-unbind-method-implementations (method) "Make the generic method METHOD have no implementations.. It will leave the original generic function in place, but remove reference to all implementations of METHOD." (put method 'eieio-method-tree nil) (put method 'eieio-method-obarray nil)) -- Eric Ludlam: za...@gn..., er...@si... Home: http://www.ludlam.net Siege: www.siege-engine.com Emacs: http://cedet.sourceforge.net GNU: www.gnu.org |