Code: (define (json-rpc-dispatch request) (define (dispatch j) (let* ((method-pair (assoc 'method j)) (params-pair (assoc 'params j))) (unless (and method-pair params-pair) (raise (make-json-rpc-invalid-request-error))) (let ((method-name (cdr method-pair))) (unless (and (not (pair? method-name)) (string? method-name)) (raise (make-json-rpc-invalid-request-error))) (let* ((method (hash-table-ref/default (json-rpc-handler-table) method-name #f))) (unless method (raise (make-json-rpc-method-not-found-error method-name))) (if params-pair (let ((params (extract-params params-pair))) (method params)) (method)))))) (define id (assoc 'id request)) (let ((result (dispatch request))) (cond ((not result) ;; notification #f) (id (make-response (cdr id) result #f)) (else (make-response 'null #f (make-json-rpc-invalid-request-error)))))) Scrutinizer dump: [debug|37] walk: ##core#variable (method-name868) (loc: (dispatch862 json-rpc.lolevel#json-rpc-dispatch), dest: #f, flow: (78 71)) [debug|37] walked ##core#variable -> ((list-of pair)) flow: (78 71) [debug|37] call: ((procedure scheme#string? (*) boolean) (list-of pair)), te: () [debug|37] match (any) * <-> (list-of pair) [debug|37] match1: * <-> (list-of pair) [debug|37] match (any) * <-> (list-of pair) -> #t [debug|37] match (all) string <-> (list-of pair) [debug|37] match1: string <-> (list-of pair) [debug|37] match (all) string <-> (list-of pair) -> #f [debug|37] match (all) (not string) <-> (list-of pair) [debug|37] match1: (not string) <-> (list-of pair) [debug|37] match1: string <-> (list-of pair) [debug|37] match (all) (not string) <-> (list-of pair) -> #t Note: Predicate is always false In file `json-rpc/lolevel-impl.scm:138', In module `json-rpc.lolevel', In procedure `json-rpc-dispatch', In procedure `dispatch', In procedure call: (scheme#string? method-name) The predicate will always return false. Procedure `string?' from module `scheme' is a predicate for: string The given argument has this type: (list-of pair) [debug|37] specialized: `string' for ((not string)) [debug|37] simplify: false -> false [debug|37] result-types: (false) [debug|37] walk: let (tmp1459) (loc: (dispatch862 json-rpc.lolevel#json-rpc-dispatch), dest: #f, flow: (78 71)) [debug|38] walk: ##core#the/result ((list-of pair)) (loc: (dispatch862 json-rpc.lolevel#json-rpc-dispatch), dest: tmp1459, flow: (78 71)) [debug|38] walked ##core#the/result -> ((list-of pair)) flow: (78 71) [debug|38] walk: quote (#f) (loc: (dispatch862 json-rpc.lolevel#json-rpc-dispatch), dest: #f, flow: (78 71)) [debug|38] walked quote -> (false) flow: (78 71) [debug|37] walked let -> (false) flow: (78 71) [debug|37] simplify: false -> false [debug|36] walked ##core#call -> (false) flow: (78 71) [debug|36] walk: quote (#f) (loc: (dispatch862 json-rpc.lolevel#json-rpc-dispatch), dest: #f, flow: (79 71)) [debug|36] walked quote -> (false) flow: (79 71) [debug|36] merge branch results: (false) + (false) [debug|36] simplify: (or false false) -> false [debug|35] walked if -> (false) flow: (71) Note: Test is always false In module `json-rpc.lolevel', In procedure `json-rpc-dispatch', In procedure `dispatch', In conditional expression: (if (if (scheme#not (scheme#pair? method-name)) (scheme#string? method-name) #f) (##core#undefined) (scheme.base#raise (json-rpc.lolevel#make-json-rpc-invalid-request-error)))