But, unlike Java, Smalltalk is (utterly) dynamic, and you don't have to declare a class for your code block. In Java, you had to dance that dance, until lambdas were introduced to let the compiler do that for you.
"Every object in Smalltalk, even a lowly integer, has a set of messages, a protocol, that defines the explicit communication to which that object can respond. Internally, objects may have local storage and access to other shared information which comprise the implicit context of all communication."
p290 Byte Magazine 1981
http://worrydream.com/refs/Ingalls%20-%20Design%20Principles...
> > > … instead of a function…
Instead of a function, a message.
Let's take that literally —
perform: aSymbol with: anObject
Answer the result of sending a binary message
to the receiver with selector aSymbol and argument
anObject. Report an error if the number of arguments
expected by the selector is not one.
(For more of those methods, see p425https://rmod-files.lille.inria.fr/FreeBooks/SmalltalkVTutori... )
Last-time I remember using those #perform methods, it was for testing — walking the code sending arbitrary messages and and arguments.
"Smalltalk blocks and closures origin and evolution" Juan Escalada
And no lambdas are not implemented that way, rather they take advantage of invokedynamic.