by which extension libraries are defined through careful discussion of extension proposals. This promotes code portability. Many of the SRFIs are supported by all or most Scheme implementations. SRFIs with fairly wide support in different implementations include: 0: feature-based conditional expansion construct 1: list library 4: homogeneous numeric vector datatypes 6: basic string ports 8: receive, binding to multiple values 9: defining record types 13: string library 14: character-set library 16: syntax for procedures of variable arity 17: generalized set! 18: Multithreading support 19: time data types and procedures 25: multi-dimensional array primitives 26: notation for specializing parameters without currying 27: sources of random bits 28: basic format strings 29: localization 30: nested multi-line comments 31: a special form for recursive evaluation 37: args-fold: a program argument processor 39: parameter objects 41: streams 42: eager comprehensions 43: vector library 45: primitives for expressing iterative lazy algorithms 60: integers as bits 61: a more general cond clause 66: octet vectors 67: compare procedures Implementations The elegant, minimalist design has made Scheme a popular target for language designers, hobbyists, and educators, and because of its small size, that of a typical interpreter, it is also a popular choice for embedded systems and scripting. This has resulted in scores of implementations, most of which differ from each other so much that porting programs from one implementation to another is quite difficult, and the small size of the standard language means that writing a useful program of any great complexity in standard, portable Scheme is almost impossible. The R6RS standard specifies a much broader language, in an attempt to broaden its appeal to programmers. Almost all implementations provide a traditional Lisp-style read–eval–print loop for development and debugging. Many also compile Scheme programs to executable binary. Support for embedding Scheme code in programs written in other languages is also common, as the relative simplicity of Scheme implementations makes it a popular choice for adding scripting capabilities to larger systems developed in languages such as C. The Gambit, Chicken, and Bigloo Scheme interpreters compile Scheme to C, which makes embedding particularly easy. In addition, Bigloo's compiler can be configured to generate JVM bytecode, and it also features an experimental bytecode generator for .NET. Some implementations support additional features. For example, Kawa and JScheme provide integration with Java classes, and the Scheme to C compilers often make it easy to use external libraries written in C, up