eval-buffer有什么我不知道的细节吗

我发现代码一步步 C-x C-e 执行没问题,但是eval-buffer就有问题

talk is cheap, show me the code

主要是这段宏展开不了

(defmacro lsp-bridge-interface (&rest interfaces)
  "Generate LSP bindings from INTERFACES triplet.

Example usage with `dash`.

\(-let [(&ApplyWorkspaceEditResponse
  :failure-reason?) (ht (\"failureReason\" \"...\"))]
  failure-reason?)

\(fn (INTERFACE-NAME-1 REQUIRED-FIELDS-1 OPTIONAL-FIELDS-1) (INTERFACE-NAME-2 REQUIRED-FIELDS-2 OPTIONAL-FIELDS-2) ...)"
  (with-case-table ascii-case-table
    (->> interfaces
         (-map (-lambda ((interface required optional))
                 (let ((params (nconc
                                (-map (lambda (param-name)
                                        (cons
                                         (intern (concat ":" (s-dashed-words (symbol-name param-name)) "?"))
                                         param-name))
                                      optional)
                                (-map (lambda (param-name)
                                        (cons (intern (concat ":" (s-dashed-words (symbol-name param-name))))
                                              param-name))
                                      required))))
                   (cl-list*
                    `(defun ,(intern (format "dash-expand:&%s" interface)) (key source)
                       (unless (or (member key ',(-map #'cl-first params))
                                   (s-starts-with? ":_" (symbol-name key)))
                         (error "Unknown key: %s.  Available keys: %s" key ',(-map #'cl-first params)))
                       `(plist-get ,source
                                   ,(if (s-starts-with? ":_" (symbol-name key))
                                        key
                                      (cl-rest (assoc key ',params)))))
                    `(defun ,(intern (format "dash-expand:&%s?" interface)) (key source)
                       (unless (member key ',(-map #'cl-first params))
                         (error "Unknown key: %s.  Available keys: %s" key ',(-map #'cl-first params)))
                       `(plist-get ,source
                                   ,(if (s-starts-with? ":_" (symbol-name key))
                                        key
                                      (cl-rest (assoc key ',params)))))

                    `(defun ,(intern (format "lsp-bridge-%s?" (s-dashed-words (symbol-name interface)))) (object)
                       (cond
                        ((ht? object)
                         (-all? (let ((keys (ht-keys object)))
                                  (lambda (prop)
                                    (member prop keys)))
                                ',(-map (lambda (field-name)
                                          (substring (symbol-name field-name) 1))
                                        required)))
                        ((listp object) (-all? (lambda (prop)
                                                 (plist-member object prop))
                                               ',required))))
                    `(cl-defun ,(intern (format "lsp-bridge-make-%s" (s-dashed-words (symbol-name interface))))
                         (&rest plist &key ,@(-map (-lambda ((key))
                                                     (intern (substring (symbol-name key) 1))) params)
                                &allow-other-keys)
                       (ignore ,@(-map (-lambda ((key))
                                         (intern (substring (symbol-name key) 1))) params))
                       ,(format "Constructs %s from `plist.'
Allowed params: %s" interface (reverse (-map #'cl-first params)))
                       (-mapcat (-lambda ((key value))
                                  (list (or (cl-rest (assoc key ',params)) key) value))
                                (-partition 2 plist)))
                    `(pcase-defmacro ,interface (&rest property-bindings)
                       `(and
                         (pred listp)
                         ;; Check if all the types required by the
                         ;; interface exist in the expr-val.
                         ,@(-map
                            (lambda (key)
                              `(pred
                                (lambda (plist)
                                  (plist-member plist ,key))))
                            ',required)
                         ;; Recursively generate the bindings.
                         ,@(let ((current-list property-bindings)
                                 (output-bindings nil))
                             ;; Invariant: while current-list is
                             ;; non-nil, the car of current-list is
                             ;; always of the form :key, while the
                             ;; cadr of current-list is either a)
                             ;; nil, b) of the form :key-next or c)
                             ;; a pcase pattern that can
                             ;; recursively match an expression.
                             (while current-list
                               (-let* (((curr-binding-as-keyword next-entry . _) current-list)
                                       (curr-binding-as-camelcased-symbol
                                        (or (alist-get curr-binding-as-keyword ',params)
                                            (error "Unknown key: %s.  Available keys: %s"
                                                   (symbol-name curr-binding-as-keyword)
                                                   ',(-map #'cl-first params))))
                                       (bound-name (lsp-bridge-keyword->symbol curr-binding-as-keyword))
                                       (next-entry-is-key-or-nil
                                        (and (symbolp next-entry)
                                             (or (null next-entry)
                                                 (s-starts-with? ":" (symbol-name next-entry))))))
                                 (cond
                                  ;; If the next-entry is either a
                                  ;; plist-key or nil, then bind to
                                  ;; bound-name the value corresponding
                                  ;; to the camelcased symbol.  Pop
                                  ;; current-list once.
                                  (next-entry-is-key-or-nil
                                   (push `(app (lambda (plist)
                                                 (plist-get plist ,curr-binding-as-camelcased-symbol))
                                               ,bound-name)
                                         output-bindings)
                                   (setf current-list (cdr current-list)))
                                  ;; Otherwise, next-entry is a pcase
                                  ;; pattern we recursively match to the
                                  ;; expression. This can in general
                                  ;; create additional bindings that we
                                  ;; persist in the top level of
                                  ;; bindings.  We pop current-list
                                  ;; twice.
                                  (t
                                   (push `(app (lambda (plist)
                                                 (plist-get plist ,curr-binding-as-camelcased-symbol))
                                               ,next-entry)
                                         output-bindings)
                                   (setf current-list (cddr current-list))))))
                             output-bindings)))
                    (-mapcat (-lambda ((label . name))
                               (list
                                `(defun ,(intern (format "lsp-bridge:%s-%s"
                                                         (s-dashed-words (symbol-name interface))
                                                         (substring (symbol-name label) 1)))
                                     (object)
                                   (plist-get object ,name))
                                `(defun ,(intern (format "lsp-bridge:set-%s-%s"
                                                         (s-dashed-words (symbol-name interface))
                                                         (substring (symbol-name label) 1)))
                                     (object value)
                                   (plist-put object ,name value))))
                             params)))))
         (apply #'append)
         (cl-list* 'progn))))

C-h f 发现代码是这样的

(lsp-bridge-interface
 (CallHierarchyCapabilities nil (:dynamicRegistration))
 (CallHierarchyItem (:kind :name :range :selectionRange :uri) (:detail :tags))
 (ClientCapabilities nil (:experimental :textDocument :workspace))
 (ClientInfo (:name) (:version))
 (CodeActionCapabilities nil (:codeActionLiteralSupport :dynamicRegistration :isPreferredSupport :dataSupport :resolveSupport))
 (CodeActionContext (:diagnostics) (:only))
 (CodeActionKindCapabilities (:valueSet) nil)
 (CodeActionLiteralSupportCapabilities nil (:codeActionKind))
 (CodeActionOptions nil (:codeActionKinds :resolveProvider))
 (CodeLensCapabilities nil (:dynamicRegistration))
 (CodeLensOptions (:resolveProvider) nil)
 (Color (:red :green :blue :alpha) nil)
 (ColorProviderCapabilities nil (:dynamicRegistration))
 (ColorProviderOptions nil (:documentSelector :id))
 (ColoringInformation (:range :styles) nil)
 (Command (:title :command) (:arguments))
 (CompletionCapabilities nil (:completionItem :completionItemKind :contextSupport :dynamicRegistration))
 (CompletionContext (:triggerKind) (:triggerCharacter))
 (CompletionItem (:label) (:additionalTextEdits :command :commitCharacters :data :deprecated :detail :documentation :filterText :insertText :insertTextFormat :insertTextMode :kind :preselect :sortText :tags :textEdit :score))
 (CompletionItemCapabilities nil (:commitCharactersSupport :deprecatedSupport :documentationFormat :preselectSupport :snippetSupport :tagSupport :insertReplaceSupport :resolveSupport))
 (CompletionItemKindCapabilities nil (:valueSet))
 (CompletionItemTagSupportCapabilities (:valueSet) nil)
 (CompletionOptions nil (:resolveProvider :triggerCharacters :allCommitCharacters))
 (ConfigurationItem nil (:scopeUri :section))
 (CreateFileOptions nil (:ignoreIfExists :overwrite))
 (DeclarationCapabilities nil (:dynamicRegistration :linkSupport))
 (DefinitionCapabilities nil (:dynamicRegistration :linkSupport))
 (DeleteFileOptions nil (:ignoreIfNotExists :recursive))
 (Diagnostic (:range :message) (:code :relatedInformation :severity :source :tags))
 (DiagnosticRelatedInformation (:location :message) nil)
 (DiagnosticsTagSupport (:valueSet) nil)
 (DidChangeConfigurationCapabilities nil (:dynamicRegistration))
 (DidChangeWatchedFilesCapabilities nil (:dynamicRegistration))
 (DocumentFilter nil (:language :pattern :scheme))
 (DocumentHighlightCapabilities nil (:dynamicRegistration))
 (DocumentLinkCapabilities nil (:dynamicRegistration :tooltipSupport))
 (DocumentLinkOptions nil (:resolveProvider))
 (DocumentOnTypeFormattingOptions (:firstTriggerCharacter) (:moreTriggerCharacter))
 (DocumentSymbol (:kind :name :range :selectionRange) (:children :deprecated :detail))
 (DocumentSymbolCapabilities nil (:dynamicRegistration :hierarchicalDocumentSymbolSupport :symbolKind))
 (ExecuteCommandCapabilities nil (:dynamicRegistration))
 (ExecuteCommandOptions (:commands) nil)
 (FileEvent (:type :uri) nil)
 (FileSystemWatcher (:globPattern) (:kind))
 (FoldingRangeCapabilities nil (:dynamicRegistration :lineFoldingOnly :rangeLimit))
 (FoldingRangeProviderOptions nil (:documentSelector :id))
 (FormattingCapabilities nil (:dynamicRegistration))
 (FormattingOptions (:tabSize :insertSpaces) (:trimTrailingWhitespace :insertFinalNewline :trimFinalNewlines))
 (HoverCapabilities nil (:contentFormat :dynamicRegistration))
 (ImplementationCapabilities nil (:dynamicRegistration :linkSupport))
 (Location (:range :uri) nil)
 (MarkedString (:language :value) nil)
 (MarkupContent (:kind :value) nil)
 (MessageActionItem (:title) nil)
 (OnTypeFormattingCapabilities nil (:dynamicRegistration))
 (ParameterInformation (:label) (:documentation))
 (ParameterInformationCapabilities nil (:labelOffsetSupport))
 (Position (:character :line) nil)
 (PublishDiagnosticsCapabilities nil (:relatedInformation :tagSupport :versionSupport))
 (Range (:start :end) nil)
 (RangeFormattingCapabilities nil (:dynamicRegistration))
 (ReferenceContext (:includeDeclaration) nil)
 (ReferencesCapabilities nil (:dynamicRegistration))
 (Registration (:method :id) (:registerOptions))
 (RenameCapabilities nil (:dynamicRegistration :prepareSupport))
 (RenameFileOptions nil (:ignoreIfExists :overwrite))
 (RenameOptions nil (:documentSelector :id :prepareProvider))
 (ResourceChange nil (:current :newUri))
 (ResourceOperation (:kind) nil)
 (SaveOptions nil (:includeText))
 (SelectionRange (:range) (:parent))
 (SelectionRangeCapabilities nil (:dynamicRegistration))
 (SemanticHighlightingCapabilities nil (:semanticHighlighting))
 (SemanticHighlightingInformation (:line) (:tokens))
 (SemanticHighlightingServerCapabilities nil (:scopes))
 (ServerCapabilities nil (:callHierarchyProvider :codeActionProvider :codeLensProvider :colorProvider :completionProvider :declarationProvider :definitionProvider :documentFormattingProvider :documentHighlightProvider :documentLinkProvider :documentOnTypeFormattingProvider :documentRangeFormattingProvider :documentSymbolProvider :executeCommandProvider :experimental :foldingRangeProvider :hoverProvider :implementationProvider :referencesProvider :renameProvider :selectionRangeProvider :semanticHighlighting :signatureHelpProvider :textDocumentSync :typeDefinitionProvider :typeHierarchyProvider :workspace :workspaceSymbolProvider :semanticTokensProvider))
 (ServerInfo (:name) (:version))
 (SignatureHelp (:signatures) (:activeParameter :activeSignature))
 (SignatureHelpCapabilities nil (:contextSupport :dynamicRegistration :signatureInformation))
 (SignatureHelpContext (:triggerKind :isRetrigger) (:activeSignatureHelp :triggerCharacter))
 (SignatureHelpOptions nil (:retriggerCharacters :triggerCharacters))
 (SignatureInformation (:label) (:documentation :parameters))
 (SignatureInformationCapabilities nil (:documentationFormat :parameterInformation))
 (StaticRegistrationOptions nil (:documentSelector :id))
 (SymbolCapabilities nil (:dynamicRegistration :symbolKind))
 (SymbolKindCapabilities nil (:valueSet))
 (SynchronizationCapabilities nil (:didSave :dynamicRegistration :willSave :willSaveWaitUntil))
 (TextDocumentClientCapabilities nil (:callHierarchy :codeAction :codeLens :colorProvider :completion :declaration :definition :documentHighlight :documentLink :documentSymbol :foldingRange :formatting :hover :implementation :onTypeFormatting :publishDiagnostics :rangeFormatting :references :rename :selectionRange :semanticHighlightingCapabilities :signatureHelp :synchronization :typeDefinition :typeHierarchyCapabilities))
 (TextDocumentContentChangeEvent (:text) (:range :rangeLength))
 (TextDocumentEdit (:textDocument :edits) nil)
 (TextDocumentIdentifier (:uri) nil)
 (TextDocumentItem (:languageId :text :uri :version) nil)
 (TextDocumentSyncOptions nil (:change :openClose :save :willSave :willSaveWaitUntil))
 (TextEdit (:newText :range) nil)
 (InsertReplaceEdit (:newText :insert :replace) nil)
 (SnippetTextEdit (:newText :range) (:insertTextFormat))
 (TypeDefinitionCapabilities nil (:dynamicRegistration :linkSupport))
 (TypeHierarchyCapabilities nil (:dynamicRegistration))
 (TypeHierarchyItem (:kind :name :range :selectionRange :uri) (:children :data :deprecated :detail :parents))
 (Unregistration (:method :id) nil)
 (VersionedTextDocumentIdentifier (:uri) (:version))
 (WorkspaceClientCapabilities nil (:applyEdit :configuration :didChangeConfiguration :didChangeWatchedFiles :executeCommand :symbol :workspaceEdit :workspaceFolders))
 (WorkspaceEdit nil (:changes :documentChanges :resourceChanges))
 (WorkspaceEditCapabilities nil (:documentChanges :failureHandling :resourceChanges :resourceOperations))
 (WorkspaceFolder (:uri :name) nil)
 (WorkspaceFoldersChangeEvent (:removed :added) nil)
 (WorkspaceFoldersOptions nil (:changeNotifications :supported))
 (WorkspaceServerCapabilities nil (:workspaceFolders))
 (ApplyWorkspaceEditParams (:edit) (:label))
 (ApplyWorkspaceEditResponse (:applied) nil)
 (CallHierarchyIncomingCall (:from :fromRanges) nil)
 (CallHierarchyIncomingCallsParams (:item) nil)
 (CallHierarchyOutgoingCall (:to :fromRanges) nil)
 (CallHierarchyOutgoingCallsParams (:item) nil)
 (CallHierarchyPrepareParams (:textDocument :position) (:uri))
 (CodeAction (:title) (:command :diagnostics :edit :isPreferred :kind :data))
 (CodeActionKind nil nil)
 (CodeActionParams (:textDocument :context :range) nil)
 (CodeLens (:range) (:command :data))
 (CodeLensParams (:textDocument) nil)
 (CodeLensRegistrationOptions nil (:documentSelector :resolveProvider))
 (ColorInformation (:color :range) nil)
 (ColorPresentation (:label) (:additionalTextEdits :textEdit))
 (ColorPresentationParams (:color :textDocument :range) nil)
 (ColoringParams (:uri :infos) nil)
 (ColoringStyle nil nil)
 (CompletionList (:items :isIncomplete) nil)
 (CompletionParams (:textDocument :position) (:context :uri))
 (CompletionRegistrationOptions nil (:documentSelector :resolveProvider :triggerCharacters))
 (ConfigurationParams (:items) nil)
 (CreateFile (:kind :uri) (:options))
 (DeclarationParams (:textDocument :position) (:uri))
 (DefinitionParams (:textDocument :position) (:uri))
 (DeleteFile (:kind :uri) (:options))
 (DidChangeConfigurationParams (:settings) nil)
 (DidChangeTextDocumentParams (:contentChanges :textDocument) (:uri))
 (DidChangeWatchedFilesParams (:changes) nil)
 (DidChangeWatchedFilesRegistrationOptions (:watchers) nil)
 (DidChangeWorkspaceFoldersParams (:event) nil)
 (DidCloseTextDocumentParams (:textDocument) nil)
 (DidOpenTextDocumentParams (:textDocument) (:text))
 (DidSaveTextDocumentParams (:textDocument) (:text))
 (DocumentColorParams (:textDocument) nil)
 (DocumentFormattingParams (:textDocument :options) nil)
 (DocumentHighlight (:range) (:kind))
 (DocumentHighlightParams (:textDocument :position) (:uri))
 (DocumentLink (:range) (:data :target :tooltip))
 (DocumentLinkParams (:textDocument) nil)
 (DocumentLinkRegistrationOptions nil (:documentSelector :resolveProvider))
 (DocumentOnTypeFormattingParams (:ch :textDocument :options :position) nil)
 (DocumentOnTypeFormattingRegistrationOptions (:firstTriggerCharacter) (:documentSelector :moreTriggerCharacter))
 (DocumentRangeFormattingParams (:textDocument :options :range) nil)
 (DocumentSymbolParams (:textDocument) nil)
 (DynamicRegistrationCapabilities nil (:dynamicRegistration))
 (ExecuteCommandParams (:command) (:arguments))
 (ExecuteCommandRegistrationOptions (:commands) nil)
 (FailureHandlingKind nil nil)
 (FoldingRange (:endLine :startLine) (:endCharacter :kind :startCharacter))
 (FoldingRangeKind nil nil)
 (FoldingRangeRequestParams (:textDocument) nil)
 (Hover (:contents) (:range))
 (HoverParams (:textDocument :position) (:uri))
 (ImplementationParams (:textDocument :position) (:uri))
 (InitializeError (:retry) nil)
 (InitializeErrorCode nil nil)
 (InitializeParams nil (:capabilities :clientInfo :clientName :initializationOptions :processId :rootPath :rootUri :trace :workspaceFolders))
 (InitializeResult (:capabilities) (:serverInfo))
 (InitializedParams nil nil)
 (LocationLink (:targetSelectionRange :targetUri :targetRange) (:originSelectionRange))
 (MarkupKind nil nil)
 (MessageParams (:type :message) nil)
 (PrepareRenameParams (:textDocument :position) (:uri))
 (PrepareRenameResult (:range :placeholder) nil)
 (PublishDiagnosticsParams (:diagnostics :uri) (:version))
 (ReferenceParams (:textDocument :context :position) (:uri))
 (RegistrationParams (:registrations) nil)
 (RenameFile (:kind :newUri :oldUri) (:options))
 (RenameParams (:newName :textDocument :position) (:uri))
 (ResolveTypeHierarchyItemParams (:item :resolve :direction) nil)
 (ResourceOperationKind nil nil)
 (SelectionRangeParams (:textDocument :positions) nil)
 (SemanticHighlightingParams (:textDocument :lines) nil)
 (ShowMessageRequestParams (:type :message) (:actions))
 (SignatureHelpParams (:textDocument :position) (:context :uri))
 (SignatureHelpRegistrationOptions nil (:documentSelector :triggerCharacters))
 (SymbolInformation (:kind :name :location) (:containerName :deprecated))
 (TextDocumentChangeRegistrationOptions (:syncKind) (:documentSelector))
 (TextDocumentPositionParams (:textDocument :position) (:uri))
 (TextDocumentRegistrationOptions nil (:documentSelector))
 (TextDocumentSaveRegistrationOptions nil (:documentSelector :includeText))
 (TypeDefinitionParams (:textDocument :position) (:uri))
 (TypeHierarchyParams (:resolve :textDocument :position) (:direction :uri))
 (UnregistrationParams (:unregisterations) nil)
 (WatchKind nil nil)
 (WillSaveTextDocumentParams (:reason :textDocument) nil)
 (WorkspaceSymbolParams (:query) nil))

需要先require,之后再展开

??? require啥?

依据你提供的代码补充的完整的示例如下

(require 'cl-lib)
(require 'dash)
(require 'ht)
(require 's)
(require 'json)

(defmacro lsp-bridge-interface (&rest interfaces)
  "Generate LSP bindings from INTERFACES triplet.

Example usage with `dash`.

\(-let [(&ApplyWorkspaceEditResponse
  :failure-reason?) (ht (\"failureReason\" \"...\"))]
  failure-reason?)

\(fn (INTERFACE-NAME-1 REQUIRED-FIELDS-1 OPTIONAL-FIELDS-1) (INTERFACE-NAME-2 REQUIRED-FIELDS-2 OPTIONAL-FIELDS-2) ...)"
  (with-case-table ascii-case-table
    (->> interfaces
         (-map (-lambda ((interface required optional))
                 (let ((params (nconc
                                (-map (lambda (param-name)
                                        (cons
                                         (intern (concat ":" (s-dashed-words (symbol-name param-name)) "?"))
                                         param-name))
                                      optional)
                                (-map (lambda (param-name)
                                        (cons (intern (concat ":" (s-dashed-words (symbol-name param-name))))
                                              param-name))
                                      required))))
                   (cl-list*
                    `(defun ,(intern (format "dash-expand:&%s" interface)) (key source)
                       (unless (or (member key ',(-map #'cl-first params))
                                   (s-starts-with? ":_" (symbol-name key)))
                         (error "Unknown key: %s.  Available keys: %s" key ',(-map #'cl-first params)))
                       `(plist-get ,source
                                   ,(if (s-starts-with? ":_" (symbol-name key))
                                        key
                                      (cl-rest (assoc key ',params)))))
                    `(defun ,(intern (format "dash-expand:&%s?" interface)) (key source)
                       (unless (member key ',(-map #'cl-first params))
                         (error "Unknown key: %s.  Available keys: %s" key ',(-map #'cl-first params)))
                       `(plist-get ,source
                                   ,(if (s-starts-with? ":_" (symbol-name key))
                                        key
                                      (cl-rest (assoc key ',params)))))

                    `(defun ,(intern (format "lsp-bridge-%s?" (s-dashed-words (symbol-name interface)))) (object)
                       (cond
                        ((ht? object)
                         (-all? (let ((keys (ht-keys object)))
                                  (lambda (prop)
                                    (member prop keys)))
                                ',(-map (lambda (field-name)
                                          (substring (symbol-name field-name) 1))
                                        required)))
                        ((listp object) (-all? (lambda (prop)
                                                 (plist-member object prop))
                                               ',required))))
                    `(cl-defun ,(intern (format "lsp-bridge-make-%s" (s-dashed-words (symbol-name interface))))
                         (&rest plist &key ,@(-map (-lambda ((key))
                                                     (intern (substring (symbol-name key) 1))) params)
                                &allow-other-keys)
                       (ignore ,@(-map (-lambda ((key))
                                         (intern (substring (symbol-name key) 1))) params))
                       ,(format "Constructs %s from `plist.'
Allowed params: %s" interface (reverse (-map #'cl-first params)))
                       (-mapcat (-lambda ((key value))
                                  (list (or (cl-rest (assoc key ',params)) key) value))
                                (-partition 2 plist)))
                    `(pcase-defmacro ,interface (&rest property-bindings)
                       `(and
                         (pred listp)
                         ;; Check if all the types required by the
                         ;; interface exist in the expr-val.
                         ,@(-map
                            (lambda (key)
                              `(pred
                                (lambda (plist)
                                  (plist-member plist ,key))))
                            ',required)
                         ;; Recursively generate the bindings.
                         ,@(let ((current-list property-bindings)
                                 (output-bindings nil))
                             ;; Invariant: while current-list is
                             ;; non-nil, the car of current-list is
                             ;; always of the form :key, while the
                             ;; cadr of current-list is either a)
                             ;; nil, b) of the form :key-next or c)
                             ;; a pcase pattern that can
                             ;; recursively match an expression.
                             (while current-list
                               (-let* (((curr-binding-as-keyword next-entry . _) current-list)
                                       (curr-binding-as-camelcased-symbol
                                        (or (alist-get curr-binding-as-keyword ',params)
                                            (error "Unknown key: %s.  Available keys: %s"
                                                   (symbol-name curr-binding-as-keyword)
                                                   ',(-map #'cl-first params))))
                                       (bound-name (lsp-bridge-keyword->symbol curr-binding-as-keyword))
                                       (next-entry-is-key-or-nil
                                        (and (symbolp next-entry)
                                             (or (null next-entry)
                                                 (s-starts-with? ":" (symbol-name next-entry))))))
                                 (cond
                                  ;; If the next-entry is either a
                                  ;; plist-key or nil, then bind to
                                  ;; bound-name the value corresponding
                                  ;; to the camelcased symbol.  Pop
                                  ;; current-list once.
                                  (next-entry-is-key-or-nil
                                   (push `(app (lambda (plist)
                                                 (plist-get plist ,curr-binding-as-camelcased-symbol))
                                               ,bound-name)
                                         output-bindings)
                                   (setf current-list (cdr current-list)))
                                  ;; Otherwise, next-entry is a pcase
                                  ;; pattern we recursively match to the
                                  ;; expression. This can in general
                                  ;; create additional bindings that we
                                  ;; persist in the top level of
                                  ;; bindings.  We pop current-list
                                  ;; twice.
                                  (t
                                   (push `(app (lambda (plist)
                                                 (plist-get plist ,curr-binding-as-camelcased-symbol))
                                               ,next-entry)
                                         output-bindings)
                                   (setf current-list (cddr current-list))))))
                             output-bindings)))
                    (-mapcat (-lambda ((label . name))
                               (list
                                `(defun ,(intern (format "lsp-bridge:%s-%s"
                                                         (s-dashed-words (symbol-name interface))
                                                         (substring (symbol-name label) 1)))
                                     (object)
                                   (plist-get object ,name))
                                `(defun ,(intern (format "lsp-bridge:set-%s-%s"
                                                         (s-dashed-words (symbol-name interface))
                                                         (substring (symbol-name label) 1)))
                                     (object value)
                                   (plist-put object ,name value))))
                             params)))))
         (apply #'append)
         (cl-list* 'progn))))


(macroexpand '(lsp-bridge-interface
 (CallHierarchyCapabilities nil (:dynamicRegistration))
 (CallHierarchyItem (:kind :name :range :selectionRange :uri) (:detail :tags))
 (ClientCapabilities nil (:experimental :textDocument :workspace))
 (ClientInfo (:name) (:version))
 (CodeActionCapabilities nil (:codeActionLiteralSupport :dynamicRegistration :isPreferredSupport :dataSupport :resolveSupport))
 (CodeActionContext (:diagnostics) (:only))
 (CodeActionKindCapabilities (:valueSet) nil)
 (CodeActionLiteralSupportCapabilities nil (:codeActionKind))
 (CodeActionOptions nil (:codeActionKinds :resolveProvider))
 (CodeLensCapabilities nil (:dynamicRegistration))
 (CodeLensOptions (:resolveProvider) nil)
 (Color (:red :green :blue :alpha) nil)
 (ColorProviderCapabilities nil (:dynamicRegistration))
 (ColorProviderOptions nil (:documentSelector :id))
 (ColoringInformation (:range :styles) nil)
 (Command (:title :command) (:arguments))
 (CompletionCapabilities nil (:completionItem :completionItemKind :contextSupport :dynamicRegistration))
 (CompletionContext (:triggerKind) (:triggerCharacter))
 (CompletionItem (:label) (:additionalTextEdits :command :commitCharacters :data :deprecated :detail :documentation :filterText :insertText :insertTextFormat :insertTextMode :kind :preselect :sortText :tags :textEdit :score))
 (CompletionItemCapabilities nil (:commitCharactersSupport :deprecatedSupport :documentationFormat :preselectSupport :snippetSupport :tagSupport :insertReplaceSupport :resolveSupport))
 (CompletionItemKindCapabilities nil (:valueSet))
 (CompletionItemTagSupportCapabilities (:valueSet) nil)
 (CompletionOptions nil (:resolveProvider :triggerCharacters :allCommitCharacters))
 (ConfigurationItem nil (:scopeUri :section))
 (CreateFileOptions nil (:ignoreIfExists :overwrite))
 (DeclarationCapabilities nil (:dynamicRegistration :linkSupport))
 (DefinitionCapabilities nil (:dynamicRegistration :linkSupport))
 (DeleteFileOptions nil (:ignoreIfNotExists :recursive))
 (Diagnostic (:range :message) (:code :relatedInformation :severity :source :tags))
 (DiagnosticRelatedInformation (:location :message) nil)
 (DiagnosticsTagSupport (:valueSet) nil)
 (DidChangeConfigurationCapabilities nil (:dynamicRegistration))
 (DidChangeWatchedFilesCapabilities nil (:dynamicRegistration))
 (DocumentFilter nil (:language :pattern :scheme))
 (DocumentHighlightCapabilities nil (:dynamicRegistration))
 (DocumentLinkCapabilities nil (:dynamicRegistration :tooltipSupport))
 (DocumentLinkOptions nil (:resolveProvider))
 (DocumentOnTypeFormattingOptions (:firstTriggerCharacter) (:moreTriggerCharacter))
 (DocumentSymbol (:kind :name :range :selectionRange) (:children :deprecated :detail))
 (DocumentSymbolCapabilities nil (:dynamicRegistration :hierarchicalDocumentSymbolSupport :symbolKind))
 (ExecuteCommandCapabilities nil (:dynamicRegistration))
 (ExecuteCommandOptions (:commands) nil)
 (FileEvent (:type :uri) nil)
 (FileSystemWatcher (:globPattern) (:kind))
 (FoldingRangeCapabilities nil (:dynamicRegistration :lineFoldingOnly :rangeLimit))
 (FoldingRangeProviderOptions nil (:documentSelector :id))
 (FormattingCapabilities nil (:dynamicRegistration))
 (FormattingOptions (:tabSize :insertSpaces) (:trimTrailingWhitespace :insertFinalNewline :trimFinalNewlines))
 (HoverCapabilities nil (:contentFormat :dynamicRegistration))
 (ImplementationCapabilities nil (:dynamicRegistration :linkSupport))
 (Location (:range :uri) nil)
 (MarkedString (:language :value) nil)
 (MarkupContent (:kind :value) nil)
 (MessageActionItem (:title) nil)
 (OnTypeFormattingCapabilities nil (:dynamicRegistration))
 (ParameterInformation (:label) (:documentation))
 (ParameterInformationCapabilities nil (:labelOffsetSupport))
 (Position (:character :line) nil)
 (PublishDiagnosticsCapabilities nil (:relatedInformation :tagSupport :versionSupport))
 (Range (:start :end) nil)
 (RangeFormattingCapabilities nil (:dynamicRegistration))
 (ReferenceContext (:includeDeclaration) nil)
 (ReferencesCapabilities nil (:dynamicRegistration))
 (Registration (:method :id) (:registerOptions))
 (RenameCapabilities nil (:dynamicRegistration :prepareSupport))
 (RenameFileOptions nil (:ignoreIfExists :overwrite))
 (RenameOptions nil (:documentSelector :id :prepareProvider))
 (ResourceChange nil (:current :newUri))
 (ResourceOperation (:kind) nil)
 (SaveOptions nil (:includeText))
 (SelectionRange (:range) (:parent))
 (SelectionRangeCapabilities nil (:dynamicRegistration))
 (SemanticHighlightingCapabilities nil (:semanticHighlighting))
 (SemanticHighlightingInformation (:line) (:tokens))
 (SemanticHighlightingServerCapabilities nil (:scopes))
 (ServerCapabilities nil (:callHierarchyProvider :codeActionProvider :codeLensProvider :colorProvider :completionProvider :declarationProvider :definitionProvider :documentFormattingProvider :documentHighlightProvider :documentLinkProvider :documentOnTypeFormattingProvider :documentRangeFormattingProvider :documentSymbolProvider :executeCommandProvider :experimental :foldingRangeProvider :hoverProvider :implementationProvider :referencesProvider :renameProvider :selectionRangeProvider :semanticHighlighting :signatureHelpProvider :textDocumentSync :typeDefinitionProvider :typeHierarchyProvider :workspace :workspaceSymbolProvider :semanticTokensProvider))
 (ServerInfo (:name) (:version))
 (SignatureHelp (:signatures) (:activeParameter :activeSignature))
 (SignatureHelpCapabilities nil (:contextSupport :dynamicRegistration :signatureInformation))
 (SignatureHelpContext (:triggerKind :isRetrigger) (:activeSignatureHelp :triggerCharacter))
 (SignatureHelpOptions nil (:retriggerCharacters :triggerCharacters))
 (SignatureInformation (:label) (:documentation :parameters))
 (SignatureInformationCapabilities nil (:documentationFormat :parameterInformation))
 (StaticRegistrationOptions nil (:documentSelector :id))
 (SymbolCapabilities nil (:dynamicRegistration :symbolKind))
 (SymbolKindCapabilities nil (:valueSet))
 (SynchronizationCapabilities nil (:didSave :dynamicRegistration :willSave :willSaveWaitUntil))
 (TextDocumentClientCapabilities nil (:callHierarchy :codeAction :codeLens :colorProvider :completion :declaration :definition :documentHighlight :documentLink :documentSymbol :foldingRange :formatting :hover :implementation :onTypeFormatting :publishDiagnostics :rangeFormatting :references :rename :selectionRange :semanticHighlightingCapabilities :signatureHelp :synchronization :typeDefinition :typeHierarchyCapabilities))
 (TextDocumentContentChangeEvent (:text) (:range :rangeLength))
 (TextDocumentEdit (:textDocument :edits) nil)
 (TextDocumentIdentifier (:uri) nil)
 (TextDocumentItem (:languageId :text :uri :version) nil)
 (TextDocumentSyncOptions nil (:change :openClose :save :willSave :willSaveWaitUntil))
 (TextEdit (:newText :range) nil)
 (InsertReplaceEdit (:newText :insert :replace) nil)
 (SnippetTextEdit (:newText :range) (:insertTextFormat))
 (TypeDefinitionCapabilities nil (:dynamicRegistration :linkSupport))
 (TypeHierarchyCapabilities nil (:dynamicRegistration))
 (TypeHierarchyItem (:kind :name :range :selectionRange :uri) (:children :data :deprecated :detail :parents))
 (Unregistration (:method :id) nil)
 (VersionedTextDocumentIdentifier (:uri) (:version))
 (WorkspaceClientCapabilities nil (:applyEdit :configuration :didChangeConfiguration :didChangeWatchedFiles :executeCommand :symbol :workspaceEdit :workspaceFolders))
 (WorkspaceEdit nil (:changes :documentChanges :resourceChanges))
 (WorkspaceEditCapabilities nil (:documentChanges :failureHandling :resourceChanges :resourceOperations))
 (WorkspaceFolder (:uri :name) nil)
 (WorkspaceFoldersChangeEvent (:removed :added) nil)
 (WorkspaceFoldersOptions nil (:changeNotifications :supported))
 (WorkspaceServerCapabilities nil (:workspaceFolders))
 (ApplyWorkspaceEditParams (:edit) (:label))
 (ApplyWorkspaceEditResponse (:applied) nil)
 (CallHierarchyIncomingCall (:from :fromRanges) nil)
 (CallHierarchyIncomingCallsParams (:item) nil)
 (CallHierarchyOutgoingCall (:to :fromRanges) nil)
 (CallHierarchyOutgoingCallsParams (:item) nil)
 (CallHierarchyPrepareParams (:textDocument :position) (:uri))
 (CodeAction (:title) (:command :diagnostics :edit :isPreferred :kind :data))
 (CodeActionKind nil nil)
 (CodeActionParams (:textDocument :context :range) nil)
 (CodeLens (:range) (:command :data))
 (CodeLensParams (:textDocument) nil)
 (CodeLensRegistrationOptions nil (:documentSelector :resolveProvider))
 (ColorInformation (:color :range) nil)
 (ColorPresentation (:label) (:additionalTextEdits :textEdit))
 (ColorPresentationParams (:color :textDocument :range) nil)
 (ColoringParams (:uri :infos) nil)
 (ColoringStyle nil nil)
 (CompletionList (:items :isIncomplete) nil)
 (CompletionParams (:textDocument :position) (:context :uri))
 (CompletionRegistrationOptions nil (:documentSelector :resolveProvider :triggerCharacters))
 (ConfigurationParams (:items) nil)
 (CreateFile (:kind :uri) (:options))
 (DeclarationParams (:textDocument :position) (:uri))
 (DefinitionParams (:textDocument :position) (:uri))
 (DeleteFile (:kind :uri) (:options))
 (DidChangeConfigurationParams (:settings) nil)
 (DidChangeTextDocumentParams (:contentChanges :textDocument) (:uri))
 (DidChangeWatchedFilesParams (:changes) nil)
 (DidChangeWatchedFilesRegistrationOptions (:watchers) nil)
 (DidChangeWorkspaceFoldersParams (:event) nil)
 (DidCloseTextDocumentParams (:textDocument) nil)
 (DidOpenTextDocumentParams (:textDocument) (:text))
 (DidSaveTextDocumentParams (:textDocument) (:text))
 (DocumentColorParams (:textDocument) nil)
 (DocumentFormattingParams (:textDocument :options) nil)
 (DocumentHighlight (:range) (:kind))
 (DocumentHighlightParams (:textDocument :position) (:uri))
 (DocumentLink (:range) (:data :target :tooltip))
 (DocumentLinkParams (:textDocument) nil)
 (DocumentLinkRegistrationOptions nil (:documentSelector :resolveProvider))
 (DocumentOnTypeFormattingParams (:ch :textDocument :options :position) nil)
 (DocumentOnTypeFormattingRegistrationOptions (:firstTriggerCharacter) (:documentSelector :moreTriggerCharacter))
 (DocumentRangeFormattingParams (:textDocument :options :range) nil)
 (DocumentSymbolParams (:textDocument) nil)
 (DynamicRegistrationCapabilities nil (:dynamicRegistration))
 (ExecuteCommandParams (:command) (:arguments))
 (ExecuteCommandRegistrationOptions (:commands) nil)
 (FailureHandlingKind nil nil)
 (FoldingRange (:endLine :startLine) (:endCharacter :kind :startCharacter))
 (FoldingRangeKind nil nil)
 (FoldingRangeRequestParams (:textDocument) nil)
 (Hover (:contents) (:range))
 (HoverParams (:textDocument :position) (:uri))
 (ImplementationParams (:textDocument :position) (:uri))
 (InitializeError (:retry) nil)
 (InitializeErrorCode nil nil)
 (InitializeParams nil (:capabilities :clientInfo :clientName :initializationOptions :processId :rootPath :rootUri :trace :workspaceFolders))
 (InitializeResult (:capabilities) (:serverInfo))
 (InitializedParams nil nil)
 (LocationLink (:targetSelectionRange :targetUri :targetRange) (:originSelectionRange))
 (MarkupKind nil nil)
 (MessageParams (:type :message) nil)
 (PrepareRenameParams (:textDocument :position) (:uri))
 (PrepareRenameResult (:range :placeholder) nil)
 (PublishDiagnosticsParams (:diagnostics :uri) (:version))
 (ReferenceParams (:textDocument :context :position) (:uri))
 (RegistrationParams (:registrations) nil)
 (RenameFile (:kind :newUri :oldUri) (:options))
 (RenameParams (:newName :textDocument :position) (:uri))
 (ResolveTypeHierarchyItemParams (:item :resolve :direction) nil)
 (ResourceOperationKind nil nil)
 (SelectionRangeParams (:textDocument :positions) nil)
 (SemanticHighlightingParams (:textDocument :lines) nil)
 (ShowMessageRequestParams (:type :message) (:actions))
 (SignatureHelpParams (:textDocument :position) (:context :uri))
 (SignatureHelpRegistrationOptions nil (:documentSelector :triggerCharacters))
 (SymbolInformation (:kind :name :location) (:containerName :deprecated))
 (TextDocumentChangeRegistrationOptions (:syncKind) (:documentSelector))
 (TextDocumentPositionParams (:textDocument :position) (:uri))
 (TextDocumentRegistrationOptions nil (:documentSelector))
 (TextDocumentSaveRegistrationOptions nil (:documentSelector :includeText))
 (TypeDefinitionParams (:textDocument :position) (:uri))
 (TypeHierarchyParams (:resolve :textDocument :position) (:direction :uri))
 (UnregistrationParams (:unregisterations) nil)
 (WatchKind nil nil)
 (WillSaveTextDocumentParams (:reason :textDocument) nil)
 (WorkspaceSymbolParams (:query) nil)))

宏被定义之后,应该就可以直接用了吧,还需要macoexpand吗

是可以直接用的,上面的示例是回复你说的展不开

严格来说有的宏定义是不可以直接用的,会涉及编译时求值,大多数情况下都可以直接用

阿这,不是应该使用的时候展开代码吗

lisp中的宏不仅是一种形式展开,也是一种计算,还会涉及求值,编译求值这些