&gt;1) It sure is awkward to represent struct fields 1 2 3 as (cdr struct), (cadr struct), (caddr)<p>Every Scheme implementation I know of supports record types aka SRFI-9[0].  No one actually makes new data types from cons cells.<p>&gt;2) Scheme code is very imperative!<p>Scheme supports many programming paradigms.  Imperative programming is one.  Functional programming, object-oriented programming, and relational programming are others.  Not all Scheme code is imperative.<p>&gt;3) It is awkward to represent environments with assoc lists.<p>Every Scheme implementation I know of has traditional mutable hash tables.  Sometimes you want a hash table, sometimes you want an alist.  It depends.<p>&gt;4) Macros also seem to have a needlessly different syntax than regular functions.<p>I don&#x27;t really understand this point.  Are you talking about syntax-rules?  If so, then I must disagree.  syntax-rules is a very elegant language for defining hygienic macros.<p>SICP does <i>not</i> teach you everything that Scheme has to offer, and the Scheme implementations of the 1980s are a lot different than the Scheme implementations of 2016.<p>[0] <a href="http:&#x2F;&#x2F;srfi.schemers.org&#x2F;srfi-9&#x2F;srfi-9.html" rel="nofollow">http:&#x2F;&#x2F;srfi.schemers.org&#x2F;srfi-9&#x2F;srfi-9.html</a>