   assignCompile ctx, call,
     (jsBinaryMulti "+", join (concat formattedArgs), [string_ formatString])
 
+ms.syntax = ms_syntax = (ctx, call) ->
+  hasName = requireName ctx, 'Name required to declare new algebraic data'
+  [paramTuple, rest...] = _arguments call
+  [body] = rest
+
+  # ctx.addMacro ctx.definitionName(), (ctx) ->
+  #   expressionCompile ctx, body
+
+  if hasName
+    macroName = ctx.definitionName()
+
+    # params = (map (__ token_, _symbol), _terms paramTuple) # freshen
+
+    compiledMacro = translateToJs translateIr ctx,
+        (termCompile ctx, call_ (token_ 'fn'), (join [paramTuple], rest))
+    macroFn = eval compiledMacro
+    ctx.addMacro macroName, (ctx, call) ->
+      # operatorCompile ctx, call
+      # args = termsCompile ctx, (_arguments call)[0..macroFn.length]
+      #callTyping ctx, call
+      macroFn (_arguments call)...
+
+    # ctx.addMacro macroName, (ctx, call) ->
+    #   compiled = termCompile ctx, (fn_ params, body)
+    #   assignCompile ctx, body, compiled
+
+    jsNoop()
+
+
+ms['`'] = ms_quote = (ctx, call) ->
+  [res] = _arguments call
+  # call.tea = toConstrained typeConstant 'Exp'
+  # assignCompile ctx, call, res
+  call.tea = toConstrained typeConstant 'Expression'
+
+  serializeAst = (ast) ->
+    if isForm ast
+      if (_operator ast)?.symbol is ','
+        termCompile ctx, ast
+      else
+        (jsArray (map serializeAst, ast))
+    else
+      (jsValue (JSON.stringify ast))
+  serializeAst res
+
+ms[','] = ms_comma = (ctx, call) ->
+  (expressionCompile ctx, (_arguments call)[0])
+
 ms.macro = ms_macro = (ctx, call) ->
   hasName = requireName ctx, 'Name required to declare a new instance'
   [paramTuple, type, rest...] = _arguments call

    [expression] = _terms ast
    {js} = compileCtxAstToJs topLevelExpression, ctx, expression
    (finalizeTypes ctx, expression)
    js: library + immutable + (listOfLines map lookupJs, modules) + js
    ast: ast
    errors: checkTypes ctx


      if nonLabeledArgs.length < positionalParams.length
        # log "currying known call"
        lambda = (fn_ extraParams, sortedCall)
        compiled = callMacroCompile ctx, lambda
        retrieve call, lambda
        # TODO: massive hack, erase inserted scope, will have to figure out how to fix this better
        ctx.savedScopes[ctx.savedScopes.length - 1].definitions = newMap()
