我在CL写了一个地牢爬虫游戏,我遇到了案例表格的问题.
两件事情:
Duplicate keyform QUOTE in CASE statement(make-instance 'cl-rogue:tile tile-type 'wall) 应打印为"#",但无论我使用哪种图块类型,对象都会打印为"".代码:
(in-package :cl-user)
(defpackage :cl-rogue
(:use :common-lisp)
(:export
:*rows*
:*cols*
:*levels*
:tile
:tile-type
:tile-contents
:tile-hidden
:tile-locked
:tile-closed
:main))
(in-package :cl-rogue)
(defparameter *cols* 80)
(defparameter *rows* 24)
(defparameter *levels* 26)
Run Code Online (Sandbox Code Playgroud)
班级:
(defclass tile ()
((tile-type
:initarg :tile-type
:accessor tile-type
:initform 'floor
:documentation "Type of tile")
(tile-contents
:initarg :tile-contents
:accessor tile-contents
:initform '()
:documentation "Any items the tile holds")
(tile-hidden
:initarg :tile-hidden
:accessor tile-hidden
:initform nil
:documentation …Run Code Online (Sandbox Code Playgroud) 我正在尝试删除标记'(单引号),但我不知道如何.我在做,delm \'但它不起作用.我也试过了我能想到的每一个组合.
我意识到这更像是一个Vim脚本问题,但我无法在任何地方找到它.
以下哪个表达式具有正确的lisp语法?
(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2
Run Code Online (Sandbox Code Playgroud)
我目前正在编写自己的lisp解释器,并不太确定如何正确处理引号.我看过的大多数lisp解释器都将表达式计算为"2".但是,根本不应该对报价进行评估,从而只有第二个是法律表达?那么为什么它仍然适用呢?这是某种语法糖吗?
我有一个关于评估lisp中列表的问题.
为什么(a)和(+ a 1)不评估,
(defun test (a) (+ a 1))
Run Code Online (Sandbox Code Playgroud)
就像(print 4)这里没有评估一样
(if (< 1 2) (print 3) (print 4))
Run Code Online (Sandbox Code Playgroud)
但(print (+ 2 3))在这里评估
(test (print (+ 2 3)))
Run Code Online (Sandbox Code Playgroud)
它们与标准库函数有关吗?我可以在我的lisp程序中定义类似的函数吗?
在编写bash脚本时,我一直对引用和评估的规则感到困惑.我知道一些基础知识,比如''和'"与``之间的区别,但我似乎仍然经常出错,并且试图尝试各种不同的方式来说同样的事情.
我通常可以通过蛮力解决任何个别问题,但我认为我的工作原理的概念模型必须以一种未知的方式无可救药地打破.
我对lisp的引用,评估,阅读,打印,语法报价系统没有任何问题.事实上,我写了一个小卡塔,以帮助人们了解发生了什么:http://www.learningclojure.com/2010/11/syntax-quote-kata-for-confused.html
我想我正在为bash寻找类似的东西(这看起来要复杂得多).一个好的模型或一组练习将帮助我形成这样一个模型,这将使我能够看到一个复杂的shell脚本,其中变量被转换和评估,打印出来并读取,并找出将要发生的事情无需尝试.
如果做不到这一点,调试过程的好方法,以及在评估的每个阶段观察正在发生的事情都会非常有帮助.
我正在努力学习计划.谁能告诉我为什么'(quote quote)输出'quote,'(quote 'quote)并将输出''quote?
非常感谢你!
user=> (eval '(+ 1 2))
3
user=> (eval '('+ 1 2))
2
user=> (eval (list '+ '1 '2))
3
user=> (eval (list + '1 '2))
3
Run Code Online (Sandbox Code Playgroud)
这是否意味着'+有时与+相同?
是否有任何规则来确定应考虑哪种情况?
为什么第二个单行内容尽管有单引号?
perl -wE 'say('Hello')'
# Name "main::Hello" used only once: possible typo at -e line 1.
# say() on unopened filehandle Hello at -e line 1.
perl -wE 'say length('Hello')'
# 5
Run Code Online (Sandbox Code Playgroud) 我想生产
list(quote(10^2), quote(10^3), quote(10^4),
quote(10^5), quote(10^6), quote(10^7))
Run Code Online (Sandbox Code Playgroud)
从
seq(2,7)
Run Code Online (Sandbox Code Playgroud)
是否有一种不那么笨拙的方式来做到这一点
mapply(function(n) substitute(10^x, list(x=as.double(n))), seq(2,7))
Run Code Online (Sandbox Code Playgroud)
?我尝试过以下方法:
> substitute(10^x, list(x=seq(2,7)))
10^2:7
> mapply(substitute, 10^x, x=seq(2,7))
Error in mapply(substitute, 10^x, x = seq(2, 7)) : object 'x' not found
> mapply(function(n) substitute(10^n), seq(2,7))
list(10^dots[[1L]][[6L]], 10^dots[[1L]][[6L]], 10^dots[[1L]][[6L]],
10^dots[[1L]][[6L]], 10^dots[[1L]][[6L]], 10^dots[[1L]][[6L]])
Run Code Online (Sandbox Code Playgroud) 在Elixir中,何时应该使用Macro.escape/1而不是quote/1?我看过初学者的指南并没有帮助.
quote ×10
eval ×3
lisp ×2
bash ×1
case ×1
clojure ×1
command-line ×1
common-lisp ×1
elixir ×1
escaping ×1
evaluation ×1
expression ×1
interpreter ×1
linux ×1
macros ×1
perl ×1
r ×1
racket ×1
scheme ×1
sh ×1
vim ×1