Skip to content

Latest commit

 

History

History
177 lines (143 loc) · 13 KB

langchart.org

File metadata and controls

177 lines (143 loc) · 13 KB
TYPE DISCIPLINEClojureErlangF#HaskellJavaJavaScriptPythonScala
strongly typedyesyesyesyesyesyesyes
statically typednonoyesyesyesnoyes
coercionnoyesyesyes
null referencenoyesyesyes
strict booleansnoyesyesnoyes
most types reifiednoyesyesyes
all types reifiednonoyesno

Notes: Manifests can prevent type-erasure in Scala in only very limited cases.

STATIC TYPESF#HaskellJavaScala
type inferenceyesyesnoyes
path-dependent typesyes
existential typesyesyes
self typesnoyes
bottom typesnoyes
compound typesyes
higher kinded typesnoyes
structural typesnoyes
sum types
product types
recursive types
type boundsyesyes
viewsyes
view boundsyes
OBJECTSClojureErlangF#HaskellJavaJavaScriptPythonScala
objectsyesyesyesyes
all values are objectsnoyesyes
?enforced encapsulation?yesnoyes

Notes: Objects are function/data containers that are first-class values.

CLASSESF#JavaPythonScala
class type parametersyesnoyes
multiple constructorsyesyes
anonymous classesyesyes
inner classesyesyes
reference to current objectyesnoyes
reference to parent classyesyes
INHERITANCEClojureErlangF#HaskellJavaJavaScriptPythonScala
abstract functionsyesnoyes
abstract datanonoyes
abstract typesnonoyes
concrete function inheritanceyesyesyes
concrete data inheritanceyesyesyes
type aliasesnoyes
multiple abstract inheritanceyesnoyes
multiple concrete inheritancenoyesyes
?virtual functions?
FUNCTIONSClojureErlangF#HaskellJavaJavaScriptPythonScala
function type parametersyesnoyes
operators evaluate like functionsnonoyes
operator overloadingyesnoyesyes
first-class functionsyesyesyesnoyesyes
anonymous functionsyesyesyesnoyesyes
nested named functionsnoyesyes
curryingyesnoyes
partial application of functionsyesyesnostdlibyes
overloadingyesyesnoyes
default argumentsnoyesyes
named argumentsnoyesyes
variable number argumentsyesyes
keyword parameter mapsnoyes
unstructured side-effectsyesyesnoyesyesyes
?dispatch?
?generators?
?continuations?

Notes: Scala’s methods aren’t themselves first-class but can always be treated as such.

BINDINGS & SCOPEClojureErlangF#HaskellJavaJavaScriptPythonScala
lexical scopeyesnoyes
shadowingnoyes
single assignment variablesnoyesyesyesnoyes
multiple assignment variablesyesnonoyesyesyes
closuresnoyes
pattern matchingyesyesyesnonoyes
pattern matching in parametersyesyesnonono
mutable stateyesnoyesyesyes
?unmanaged mutable state?nonoyesyesyes
?forward declarations?
?globals?

Notes: Java only allows shadowing of class members.

CONTROLClojureErlangF#HaskellJavaJavaScriptPythonScala
ifyesyesyesyesyesyes
if uses strict booleansnoyesnoyes
foreachyesyesyes
whileyesyesyes
finally on loopsnoyesno
exceptionsyesyesyesyes
caseyesnonoyes
break/continueyesyesno
switch
returnyesyesyes
LIBRARYClojureErlangF#HaskellJavaJavaScriptPythonScala
user-defined conversionnoyes
implicit functionsnoyes
implicit parametersnoyes
first-class modulesyes

Notes: Scala 2.8’s package objects can only add members to a package.

EVALUATIONClojureErlangF#HaskellJavaJavaScriptPythonScala
?lazy functions?
?lazy expressions?
lazy initialization of fieldsnoyes
delayed parameter evaluationnoyes
eager parameter evaluationyesyesyes
uniform access principlenonoyes
atomsyesyesnonono

Notes: Only Java’s static fields are initialized lazily.

PROGRAM TEXTClojureErlangF#HaskellJavaJavaScriptPythonScala
whitespace significantyesnonoyesno
homoiconicityyesnononononono
preprocessoryesnono
macrosyesnonono
metaprogramming
regular expressionsyesnonono
reflectionyes
COLLECTIONS SYNTAXClojureErlangF#HaskellJavaJavaScriptPythonScala
listsyesyesyesnoyesno
consyesnono
indexesnoyesno
rangesyesnonono
slicesnoyesno
tuplesyesyesyesyes
comprehensionsyesyesyesnoyesyes
mapsyesnonoyesno
BASIC TYPESClojureErlangF#HaskellJavaJavaScriptPythonScala
integers are arbitrary-sizeyesyesyesnono
strings are sequencesyesyesnoyesyes
IMPLEMENTATIONClojureErlangF#HaskellJavaJavaScriptPythonScala
true parallelismyesyesyesyesyesnoyes
full tail call optimizationnoyesyesnonono

Notes: CPython’s global interpreter lock prevents two threads from making progress at the same time. Jython and IronPython do not suffer from this problem.