aug 10 2009 The new assignment operators ()= and {}= are like +=, but for casting. ()= casts by type name. The statement x ()= unsigned int; is equivalent in effect and value to x = (unsigned int)x; Likewise, x ()= struct dom`X*; is equivalent to x = (struct dom`X*)x; ()= has the same precedence and associativity as the other assignment operators. In a similar way, {}= applies the extended cast operator to its operands: x {}= dom; is equivalent to x = {dom}x; aug 18 2009 The new syntax form @lazyapply calls a function without evaluating its arguments. The expression: @lazyapply(, , ...) is equivalent to (lambda(){ }, ...); Where and are arbitrary expressions. aug 19 2009 There is new syntax for variable arity functions. It accomplishes a similar specification as the dotted list syntax in Scheme lambda expressions. For example, the expression lambda(a, b ...) { ... } evaluates to a variable arity function of at least one parameter. The first actual parameter is bound to a. The remaining parameters are passed in a freshly allocated list that is bound to b. The original variable arity syntax lambda x { ... } will soon go away, since it is equivalent to lambda(x ...) { ... } sep 04 2009 Three incompatible changes have been made to Cinquecento syntax. 1. The original variable arity lambda syntax lambda x has been eliminated. Instead, use lambda(x ...) 2. Similarly, the variable arity define syntax define id x has been eliminated. Instead, use define id(x ...) 3. Table initializer syntax now uses square braces instead of curly braces. Forms like tab = { : , ... }; // old should now be written tab = [ : , ... ]; // new sep 05 2009 The C goto statement is now supported. dec 02 2009 The keywords "containerof", "define", "lambda", "nil", and "typeof" will soon go away. The new keywords "@containerof", "@define", "@lambda", "@nil", and "@typeof" are their replacements. With this change, the remaining keywords that do not begin with @ all have the property that they are keywords of C. dec 07 2009 @nil is no longer a keyword. Instead, the built-in top-level variable nil is bound to the nil value. Currently, this binding variable is mutable: like an other built-in binding, programs can change what is bound to nil. We plan to make nil and other bindings immutable. jun 05 2011 The suffixes K, M, G, T, when applied to an integer literal, shift the value left by 10, 20, 30, 40 bits, respectively. The 0B and 0b prefixes allow integer literals to be expressed in binary. Floating-point values may be used in limited ways. As a predicate value, the value nil is now false. The new functions applyk and evalk support recovery from errors. In an @names body, enum constants may be referenced in subsequent enum and array declarations. lib/snames.cqct is a new remote server for name spaces backed by .names files. Pairs have been embraced are a real Cinquecento type. Cids are a new Cinquecento type for representing C identifiers. They also provide a general-purpose symbol type. The storage manager has been upgraded to a generational copying collector. It supports a static (uncollected) heap, guardians, and weak pairs. The rules by which variables are assigned implicit bindings have been revised. Several new warnings are issued for binding mishaps. These warnings cannot be suppressed. The role of @typeof in constructing type names has been transferred to a new form, @typename. @typeof now resolves type definitions, only. @const is deprecated. It currently is a whitespace token; soon it will disappear. The operators ()= and {}= have been eliminated. The extended accessor ctype variant has been eliminated. jun 12 2011 The equivalence predicate (equal) applied by tables has been relaxed to disregard the type of cvalues. Tables constructed by the new function mktabqv reflect the previous behavior, supported by a new equivalence predicate (eqv) and associated hash function (hashqv). The details of equivalence are now documented. jun 29 2011 Stringof now ends its search for string bytes if it reaches a 4KB boundary that is deemed unmapped by ismapped, in addition to respecting the address space map. This is a stop-gap defense against inaccurate address space maps, not a permanent feature. sep 19 2011 It is no longer necessary to use a backtick to reference an unqualified typedef identifier (i.e., a type name defined with typedef). For example, previously a cast to an unqualified typedef type name T would be written: np = (`T)p; Now this can be written as it would in C: np = (T)p; The previous form is deprecated. Soon it will be disallowed. Ambiguous forms involving the cast operator, such as v = (T)*p; are now always interpreted to be cast operations. If you had wanted to multiply, lose the superfluous parentheses: v = T*p; sep 20 2012 The various libraries for using the sctl process control and name space server have been revised. They are consolidate in the new library . See the new manual doc/debug.html. The read built-in no longer blocks in an attempt to read as many bytes as requested; rather, it returns as soon as some bytes (or EOF) are ready. The new built-in fread provides the previous behavior of read. The %a format verb elides long lists.