I think J has features from the left and right hand side of his diagram but not the middle.
Here's how I would try to answer his questions. closures J does not support closures, though some uses of closures can be emulated using locales (the naming management system which is used to implement classes and objects). encapsulation both data and functions are "first class" values in the language, and J provides a a functional framework which can be used to generate new data and new functions. Also references (names) can be managed in partial isolation using locales. J does not provide for user defined data types and generally treats types as a necessary evil whose impact on language semantics should be minimized. That said, J would be better described as a "function level" programming language than as a "functional" programming language. concurrency The language itself is synchronous, at the highest level. However the primitives are designed to work "in parallel" on all data in their arguments. laziness The language itself is not lazy. Applications may be lazy where the programmer has implemented laziness. state Most of the language uses "functional" (pass by value) state. The exceptions are names (user defined names are mutable), mapped files and other entities which exist outside the language. concurrency The language itself is synchronous, asynchronous issues can only arise when dealing with foreign entities. data-driven control data flow is monotonic within the language. Note also that J has primitives which deal with the issues that most languages use control structures for. "if" structures can become data selection, and "while" structures can be replaced by J's array semantics. In this context, J has more in common with SQL than, for example, with C. But this issue is probably outside the scope of what he was looking for. FYI, -- Raul ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
