我们已经从lisp获得了作业,我需要使用"循环"列表(我不知道这是什么命名).通过"循环"列表,我的意思是列表,cdr最后一个cons的哪一个指向同一列表中的第一个.
(Value1 . PointerValue2) (Value2 . PointerValue3) (Value3 . PointerValue1)
Run Code Online (Sandbox Code Playgroud)
我们被教导要创建这样的列表:
(defun cykl (l)
(setf (cdr (last l)) l)
)
Run Code Online (Sandbox Code Playgroud)
我使用的Lisp软件(Lispbox)不支持这种列表.我也在Debian上尝试了clisp,但是在创建了这样的列表后它已经崩溃了.
你知道哪些lisp实现支持这个(免费软件,os独立)?
我想对((A 4)(B 2)(C 3)(D 5))进行排序,使得结果为((D 5)(A 4)(C 3)(B 2)).我有正常的排序技术,但它不适用于子列表.
我创建了一个获取两个字符串参数的函数.该函数只是添加每个字符串长度.下面是一个代码.
(defun add_twostring_length (mystr1 mystr2)
(+ (length mystr1) (length mystr2))
)
Run Code Online (Sandbox Code Playgroud)
当我这样调用add_twostring_length函数时,
(add_twostring_length"cpp""lisp")
输出是正确的.7
但是,当我以逗号的方式调用相同的函数时,
(add_twostring_length"cpp","lisp")
我收到了一条错误消息.
错误:逗号不在反引号内.
[条件类型:READER-ERROR]
我想以这种方式调用函数(add_twostring_length "cpp", "lisp").
代码有什么问题?
我试图找到问题,在堆栈溢出流量问题上alogrithm是明确的但它和递归调用是在一个if satetment所以我无法弄清楚为什么它会变坏
(defparameter BF '(B C) )
(defparameter BR '((R1(B D E) F )(R2( D G) A )(R3(C F) A )(R4(C) D)
(R5(D ) E )(R6(A) H ) (R7(B ) X) (R8(X C) A ) ))
(defun chain_av (BF BR F)
(loop
(unless (member F BF)
(dolist (R BR)
(when (actionable R BF)
(remove R BR)
(append BF (conclusion-part R)))
(if (member F BF) (return "yes")
(or(chain_av BF BR F) (return nil)))))))
(defun conclusion-part( r)
(caddr r)
)
(write (chain_av …Run Code Online (Sandbox Code Playgroud) 所以我在Lisp中编写一个语法,并希望找到语法树的最大深度.
例如,
(SENTENCE (NOUN-PHRASE (DETERMINER THE) (NOUNPLURAL MEN))
(VERB-PHRASE-PAST
((VERBPAST SAW) (NOUN-PHRASE (DETERMINER THE) (NOUNPLURAL DOGS)))))
Run Code Online (Sandbox Code Playgroud)
最大深度应为4(句子 - >动词 - 短语 - 过去 - >名词 - 短语 - >确定者 - >).
但是列表长度为3,并且在扩展内部列表时始终不正确.
如何编写函数来返回此最大深度(不使用任何外部库)?
我定义了一个函数来重复函数调用:
(defun repeat (n f x)
(if (zerop n) x
(repeat ((- n 1) f (funcall f x)))))
Run Code Online (Sandbox Code Playgroud)
现在我想要申请cdr:
(repeat (1 (function cdr) '(1 2 4 5 6 7)))
Run Code Online (Sandbox Code Playgroud)
我清楚地提供n=1,f=cdr和x='(1 2 3 4 5 6 7).它应该适用cdr一次.这是我收到的错误消息:
Error: Funcall of 1 which is a non-function.
[condition type: TYPE-ERROR]
Run Code Online (Sandbox Code Playgroud)
但我有一个funcall的cdr,不是1.
我正在使用Franz的Allegro Lisp的免费版本.
我是lisp的菜鸟,只用了两个星期左右......
我用setq声明了一些全局变量:
(setq myvar '(WHATEVER))
和一个应该修改我告诉它的变量的函数:
(defun MYFUN (varname)
(setq varname '(POOP))
)
Run Code Online (Sandbox Code Playgroud)
但是当我拨打电话时:(MYFUN 'myvar)
并检查myvar现在的值,它仍然是(WHATEVER)如何进行MYFUN持久性更改?
好吧,我只是全新的Common Lisp编程语言,我已经从昨天开始自己学习这种语言,这也是出于兴趣.现在当我遇到函数和循环时,在了解它们之后我开始开发Prime数字Common Lisp中的问题.我的代码如下:
(defun prime (num)
(setq c 1)
(setq a 2)
(loop
(setq a (+ 1 a))
(if (= (mod num a) 0)
(setq c (+ c 1))
)
(when (> (+ a 1) 17) (return a))
)
)
(if (= c 1)
(return-from prime num)
)
)
(loop for x from 1 to 20
do (prime x)
)
Run Code Online (Sandbox Code Playgroud)
现在我遇到这个代码的问题是,每当我尝试执行此代码时,我得到的错误如下:
***IF:变量C没有值
但是我已经宣布了它的价值已经出现了.所以我想知道的是,即使我已经宣布了这个错误,为什么会出现这个错误.
正如标题所说,LISP的吸引力是什么?
我已经看到它抬高到高天然后,然后在一个基座上面翻过来.我已经看到这里的人,我认识的实际程序员,大学教授试图看起来像那些明显超越了平民语言战争的开明人员而宁愿死去而不是犯下异端邪说一种语言比另一种语言更好.
我试着去学习它,我看了几个教程,在lisp和clojure的"在x分钟内学习x"页面(因为据我所知,它是在jvm上运行的更多FP投入的lisp),我理解语法以及如何在其中执行操作.在过去的几个月里,我又多次回到教程中,但是每次语法都让我想找一个高中生的孩子,并因为混乱的代码而对他大喊大叫,因为看起来像是一个C风格的if条件变得疯狂所有嵌套的括号和简单的东西似乎成了一件苦差事.lisp似乎在几行中做了什么,其他FP语言如Haskell或F#,甚至像C#这样的非FP语言只是发现地图和过滤器似乎更少以更具表现力的方式进行.
我看错了吗?是否有需要发生的点击?我是否只找到了糟糕的资源?(如果是的话请给我一些很好的资源来学习lisp/clojure,最好是一些练习)
什么在......是lisp的吸引力?在这里诚实地向上帝提问.
先感谢您!
"程序"一词是否与SICP中的"操作"一词同义?(例如,在下面的章节中.)如果它们不相同,有什么区别和原因?
更具体地说,"复合操作"和"复合程序"之间有什么区别?有没有 ?
这是本书的另一章相关章节:
在我看来,在这些上下文中,SICP中的术语"操作"指的是算术运算(因为到目前为止,在实例中没有使用其他类型的操作 - 无论它们通常是什么).
lisp ×8
common-lisp ×7
list ×2
clojure ×1
elisp ×1
scheme ×1
scope ×1
sicp ×1
syntax ×1
terminology ×1