Not that you should necessarily use it as a production language, but I&#x27;d suggest checking Racket if you want to see dynamic typing done right. `#lang racket` doesn&#x27;t have static types, but it has dynamically checked contracts with a <i>blame</i> feature that pinpoints at the part of the program that is responsible for a contract violation. `#lang typed&#x2F;racket` has a more traditional type system (programs are checked before they even run), but the type checker is implemented entirely as a series of Racket macros, and the resulting program integrates seamlessly with untyped Racket code. Regarding refactoring, DrRacket does a pretty good job of identifying dependencies between defined symbols, even across modules. It&#x27;s true that more popular dynamic languages (JavaScript, Python, etc.) are bad at tracking useful static information, but you shouldn&#x27;t generalize from this to all dynamic languages.