5 ms·
In python, I usually deal with this with generators. It's not as elegant as conditions, but it works well enough. I've never tried to permit custom restart-like
by oddthink 14y ago
In python, I usually deal with this with generators. It's not as elegant as conditions, but it works well enough. I've never tried to permit custom restart-like behavior, but now that generators are coroutines, it should be doable.
e.g.
def parseEntry(line):
try:
parsed = foo(line)
yield parsed
except SomethingBad:
yield None
Common lisp could really use some better coroutine support (and some way to specify generic sequences). Sure, you can do it with macros, but it gets horrible fast. Have you looked at SERIES, for example?
- masklinn 14y ago> I've never tried to permit custom restart-like behavior, but now that generators are coroutines, it should be doable. It would be extremely awkward, you'd need a big dispatch table handling the generator's result and send()ing restarts up to the generator, and of course you lose condition's ability to work through stacks of blissfully unaware code, and to have default behaviors (in Smalltalk, the default behavior — in an interactive image — is to pop up a dialog asking the user if he wants to unwind the stack [as in an exception], to open a debugger at condition point or to try resuming the condition [under the assumption that the user fixed some incorrect method, or checked his network access])
- oddthink 14y agoThanks for the pointer; I've been learning some Smalltalk lately, but I haven't yet looked into the condition system. And, yes, I'm not saying that manually implementing pseudo-restarts is something I'd ever want to do, but some vague skeleton of the possibility is there.
- praptak 14y agoIf you want the restart, you need to take advantage of the PEP-342 two-way yield(), as in: ... except SomethingBad: yield None restartRequest = yield None if restartRequest: do whatever is necessary to go on The problem with the above is that the double yield() ugly. You cannot do this with single yield() because the caller would have to know in advance that next() will return None.
- whism 14y agoGeneric sequences are coming to common lisp. I'm working on a simple implementation inspired by clojure which I'll be posting to /r/lisp in the coming week.
- Chris2048 14y agoMaybe something like: https://gist.github.com/3598432 https://gist.github.com/3598432 although perhaps passing a 'handlers' object down, with which handler functions could be registered might be better?