-
Notifications
You must be signed in to change notification settings - Fork 244
Description
Is there a sound reason for requiring visit methods inout or mutating? The keyword is so powerful that I cannot implement a simple renderer/themer in a stateless/singleton class because everything everywhere must be mutable.
For something really simple: (I'm actually writing a themer returning NSAttributedString but this simple print example is enough to illustrate my point.)
public final class PrintMarkdown: MarkupWalker {
public static let shared = PrintMarkdown()
public func defaultVisit(_ markup: any Markup) {
print(type(of: markup))
for child in markup.children {
child.accept(&self)
^
error: cannot pass immutable value as inout argument: 'self' is immutable
}
}
}
Because it is a class, I also cannot mark the implementation mutating unlike a struct:
public final class PrintMarkdown: MarkupWalker {
static let shared = PrintMarkdown()
public mutating func defaultVisit(_ markup: any Markup) {
^
error: 'mutating' is not valid on instance methods in classes
print(type(of: markup))
for child in markup.children {
child.accept(&self)
}
}
}
I understand that structs maybe the go-to choice but a class is useful for overriding and other benefits. A foundation-level parser should not force all implementations to use structs.
Even if I implement a struct, everyone has to var it (no static let and so on). This feels paradoxical because every visit method is required to return a result; meaning the protocol design does not require the visitor/walker to accumulate states between visits. In other words, some implementation like this is entirely valid and to-be-expected:
public struct StringBuilder: MarkupVisitor {
public mutating func defaultVisit(_ markup: any Markup) -> String {
var result = String()
for child in markup.children {
result += child.accept(&self)
}
return result
}
}There is nothing mutating except forced keywords. And in protocol-oriented programming, any protocol should define the least required behavior, not implementation details (e.g. stateful).