2015-06-01 14 views
5

Tìm cách đánh giá mã elisp được lưu trữ trong một tệp bên ngoài và chuyển kết quả của nó dưới dạng đối số hàm. Ví dụ minh hoạ những gì tôi muốn đạt được sau:Giá trị kết quả của mã elisp được lưu trữ trong một tệp?

;; content of my_template.el 
'(this is a list) 

;; content of .emacs where result of my_template.el has to be used 
(define-auto-insert "\.ext$" 
    ;; bellow is my attempt to retrieve resulting list object 
    ;; but getting nil instead 
    (with-temp-buffer 
     (insert-file-contents ("my_template.el")) 
     (eval-buffer)))) 

Có lẽ tìm kiếm một chức năng eval giống như mà bên cạnh tác dụng phụ cũng trả về kết quả của biểu thức cuối cùng.

Bất kỳ ý tưởng nào?

+0

(a) bạn nên đọc tài liệu của 'eval-buffer', mà không cần đầu ra lập luận thêm được loại bỏ (b) đối số thứ hai cho' xác định-auto-insert' cần phải là một chức năng, bạn có thể sử dụng một dạng lambda cho một hàm ẩn danh. –

+0

Bạn đúng với bộ đệm eval, tôi đang tìm kiếm một phiên bản thay thế trả về kết quả biểu thức cuối cùng. Btw. làm thế nào có thể giúp lambda như một đối số thứ hai trong trường hợp này - tức là. đánh giá một tập tin elisp bên ngoài? –

+0

Tôi chỉ có nghĩa là bạn có thể cần phải quấn mã gọi lên trong một '(lambda() ...)' để nó là một hàm ẩn danh. –

Trả lời

3

Sử dụng biến để chia sẻ dữ liệu dễ dàng hơn và phổ biến hơn, ví dụ:

;; content of ~/my_template.el 
(defvar my-template '(this is a list)) 

;; content of .emacs where result of my_template.el has to be used 
(load-file "~/my_template.el") 
(define-auto-insert "\.ext$" 
    my-template) 

Cập nhật chức năng eval-file nên làm những gì bạn muốn:

;; content of ~/my_template.el 
'(this is a list) 

(defun eval-file (file) 
    "Execute FILE and return the result of the last expression." 
    (load-file file) 
    (with-temp-buffer 
    (insert-file-contents file) 
    (emacs-lisp-mode) 
    (goto-char (point-max)) 
    (backward-sexp) 
    (eval (sexp-at-point)))) 

(eval-file "~/my_template.el") 
=> (this is a list) 

Cập nhật hai: không đánh giá biểu thức cuối cùng hai lần

(defun eval-file (file) 
    "Execute FILE and return the result of the last expression." 
    (eval 
    (ignore-errors 
    (read-from-whole-string 
     (with-temp-buffer 
     (insert-file-contents file) 
     (buffer-string)))))) 

(eval-file "~/my_template.el") 
=> (this is a list) 
+0

Cảm ơn. Tôi đã có một ý tưởng để giải quyết điều này thông qua một biến, chỉ tò mò nếu nó có thể được giải quyết một cách chức năng thanh lịch hơn. –

+0

@DavidUnric Đây là lần đầu tiên tôi nghe về kết quả của ** một tập tin ** và kết quả của biểu thức cuối không phải là rất hữu ích hoặc đáng tin cậy, vì vậy tôi đoán không có chức năng hiện có để làm những gì bạn muốn, mặc dù Tôi biết một cách vụng về. – xuchunyang

+0

Tôi đã không làm việc trong (e) lisp nhưng trong ruby ​​/ python đôi khi nó trở nên tiện dụng để eval tập tin, nơi mà giá trị trả về là kết quả của biểu thức cuối cùng/trả về rõ ràng. Tôi nghĩ rằng nó không đáng tin cậy hơn nhiều sau đó tải tập tin đó. –

1

Không đọc từ chuỗi. Đọc từ bộ đệm.

(defun load&return (file &optional msgp) 
    "Load FILE. Return the value of the last sexp read." 
    (interactive "fFile: \np") 
    (let* ((sexp (with-current-buffer (find-file-noselect file) 
        (goto-char (point-min)) 
        (read (current-buffer)))) 
     (val (ignore-errors (eval sexp)))) 
    (prog1 val (when msgp (message "Value: %S" val))))) 
Các vấn đề liên quan