亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么伊娃是邪惡的?

為什么伊娃是邪惡的?

SMILET 2019-07-05 13:25:46
為什么伊娃是邪惡的?我知道Lisp和Scheme程序員通常說eval除非絕對必要,否則應避免。對于幾種編程語言,我已經看到了相同的建議,但我還沒有看到反對使用eval..我在哪里可以找到關于使用的潛在問題的說明?eval?例如,我知道GOTO在過程編程中(使程序不可讀和難以維護,使安全問題很難找到,等等),但我從未見過反對的論點。eval.有趣的是,同樣反對GOTO應該對延續有效,但我看到,例如,陰謀家不會說續寫是“邪惡的”-你在使用它們時應該小心。他們更有可能對使用eval而不是使用連續的代碼(據我所見-我可能錯了)。
查看完整描述

3 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

一個人不應該使用的原因有幾個。EVAL.

初學者的主要原因是:你不需要它。

示例(假設CommonLisp):

用不同的運算符計算表達式:

(let ((ops '(+ *)))
  (dolist (op ops)
    (print (eval (list op 1 2 3)))))

最好寫成:

(let ((ops '(+ *)))
  (dolist (op ops)
    (print (funcall op 1 2 3))))

有許多初學者學習Lisp認為他們需要的例子。EVAL,但是他們不需要它-因為表達式是計算的,而且還可以計算函數部分。大多數情況下,使用EVAL表明對評估人員缺乏了解。

宏也是同樣的問題。通常,初學者編寫宏,他們應該在哪里編寫函數-不了解宏的真正用途,也不理解函數已經完成了任務。

它常常是作業使用的錯誤工具。EVAL它經常表明初學者不理解通常的Lisp評估規則。

如果你覺得你需要EVAL,然后檢查一下是否有類似的事情FUNCALLREDUCEAPPLY可以用來代替。

  • FUNCALL

    -調用帶有參數的函數:

    (funcall '+ 1 2 3)

  • REDUCE

    -調用值列表上的函數,并將結果合并:

    (reduce '+ '(1 2 3))

  • APPLY

    -調用以列表作為參數的函數:

    (apply '+ '(1 2 3)).

問:我真的需要val嗎?還是編譯器/計算器已經滿足了我的實際需要?

避免的主要原因EVAL對于稍微高級的用戶:

  • 您希望確保編譯了您的代碼,因為編譯器可以檢查代碼中的許多問題,并生成更快的代碼,有時(即因子1000;-)更快。

  • 構建并需要評估的代碼不能盡早編譯。

  • 任意用戶輸入的Eval存在安全問題。

  • 評估的一些用途EVAL可能在錯誤的時間發生并造成構建問題。

為了用一個簡化的例子來解釋最后一點:

(defmacro foo (a b)
  (list (if (eql a 3) 'sin 'cos) b))

因此,我可能想要編寫一個基于第一個參數的宏SINCOS.

(foo 3 4)是嗎?(sin 4)(foo 1 4)是嗎?(cos 4).

現在我們可能有:

(foo (+ 2 1) 4)

這并不能給出預期的結果。

然后,可能需要修復宏。FOO通過評估變量:

(defmacro foo (a b)
  (list (if (eql (eval a) 3) 'sin 'cos) b))(foo (+ 2 1) 4)

但這樣做還是行不通的:

(defun bar (a b)
  (foo a b))

在編譯時不知道變量的值。

避免的一般重要原因EVAL:它經常被用于丑陋的黑客。


查看完整回答
反對 回復 2019-07-05
?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

eval(在任何語言中)都不像電鋸一樣邪惡。它是一種工具。它恰好是一種強大的工具,當被誤用時,它可以切斷四肢和內臟(比方說),但程序員工具箱中的許多工具也是如此,包括:

  • goto

    和朋友
  • 基于鎖的線程
  • 延續
  • 宏(高元或其他)
  • 指針
  • 可重新啟動的例外
  • 自修改碼
  • .還有成千上萬的演員

如果你發現自己不得不使用任何這些強大的,潛在的危險工具,問自己三次“為什么?”在一條鏈子里。例如:

“我為什么要用eval“因為?!睘槭裁从斜匾耙驗?”

如果你走到了這條鏈的盡頭,而工具看起來仍然是正確的,那就去做吧。把地獄記錄下來。把地獄弄出來。反復檢查正確性和安全性。但是做吧。


查看完整回答
反對 回復 2019-07-05
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

伊瓦爾很好,只要你知道一點兒沒錯里面是什么。進入它的任何用戶輸入都必須進行檢查和驗證。如果你不知道如何百分之百確定,那就不要去做。

基本上,用戶可以為所討論的語言輸入任何代碼,然后執行。你可以想象他能造成多大的傷害。


查看完整回答
反對 回復 2019-07-05
  • 3 回答
  • 0 關注
  • 563 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號