Some people have proposed the introduction in Python of the 'where' statement. It is quite used in Haskell:
printFreqsBySize genome keySize = do ht0 <- htNew keySize ht <- hashGenome genome keySize ht0 l <- htToList ht htFree ht return $ map draw (sortBy sortRule l) ++ [""] where genomeLen = S.length genome draw :: (S.ByteString, Int) -> String draw (key, count) = printf "%s %.3f" (S.unpack key) pct where pct = (100 * (fromIntegral count) / total) :: Double total = fromIntegral (genomeLen - keySize + 1) In some situations it improves readability of complex epressions. It also keeps the namespace clean because here "a" and "b" names are local to the where block. So only "c" exist when the 'where' block ends: c = sqrt(a*a + b*b) where: a = retrieve_a() b = retrieve_b() That is equivalent to: c = (retrieve_a() ** 2 + retrieve_b() ** 2) ** 0.5 Another of its possible usages in Python is to define Ruby-like blocks (that is multiline lambdas): obj.onclick.setcallback(f) where: def f(x, y): # callback body here ... D lambdas can be multiline, so that's not a problem. But it can be useful to write more readable expressions when they are complex: auto c = sqrt(a*a + b*b) where { auto a = retrieve_a(); auto b = retrieve_b(); } In this case you can write a single expression in D too: import std.math; auto c = (retrieve_a() ^^ 2 + retrieve_b() ^^ 2) ** 0.5; With a single expression you don't need brackets: double d = sqrt(x*x + y*y) where double x = computeX(); Bye, bearophile