Functional programming LISP:从用户处读取数字并与数组索引进行比较

Functional programming LISP:从用户处读取数字并与数组索引进行比较,functional-programming,lisp,common-lisp,Functional Programming,Lisp,Common Lisp,大家好,我是函数式编程新手,真的不清楚有人能帮我吗? 我的问题只是为了了解函数式编程语言的编写原理,例如,我如何用Lisp语言编写程序来读取用户输入,并比较用户输入和数组索引? 关于我的问题的另一部分,我们如何在lisp中指定数组的索引? 例如,我是用C#之类的数字编程语言编写这个程序的,但我怎么能用LISP编写呢 static void Main(string[] args) { while (true) { Console.Wr

大家好,我是函数式编程新手,真的不清楚有人能帮我吗? 我的问题只是为了了解函数式编程语言的编写原理,例如,我如何用Lisp语言编写程序来读取用户输入,并比较用户输入和数组索引? 关于我的问题的另一部分,我们如何在lisp中指定数组的索引? 例如,我是用C#之类的数字编程语言编写这个程序的,但我怎么能用LISP编写呢

static void Main(string[] args)
    {
        while (true)
        {
            Console.Write("Enter the number:");
            string name = Console.ReadLine();
            string[] numbers = {"0","1", "2", "3", "4", "5"};
            string[] words = {"one", "two", "three", "four", "five" };
            for (int i = 0; i < numbers.Length; i++)
            {
                if (name == numbers[i].ToString())
                {
                    Console.WriteLine(words[i].ToString());
                }
            }
        }
    }
static void Main(字符串[]args)
{
while(true)
{
控制台。写入(“输入号码:”);
字符串名称=Console.ReadLine();
字符串[]数字={“0”、“1”、“2”、“3”、“4”、“5”};
字符串[]单词={“一”、“二”、“三”、“四”、“五”};
for(int i=0;i
通用Lisp是一种多范式,而不是纯粹的功能。真的没有理由从C#更改代码算法。如果您想以程序样式编写,可以继续这样做

(defun main (&rest args)
  (declare (ignore args))   
  (loop
     (princ "Enter the number:")
     (finish-output)
     (let ((name (read-line))
           (numbers #("0" "1" "2" "3" "4" "5"))
           (words #("one" "two" "three" "four" "five")))
       (loop for i from 0 upto (length numbers)
          when (equal name (elt numbers i))
          do (print (elt words i))))))
不幸的是,您的示例在C#中无法正常工作,因此很难猜测您希望它在Lisp中做什么。下面是一个通用版本,它将对任何数字(不仅仅是0-4)执行相同的操作,但仍然遵循C#示例的“形状”


Common Lisp不是函数式语言……但是,C#也不是数字语言……更重要的是,到目前为止,您在CL中尝试了什么?您遇到了什么问题?如果您知道这是一个您想要读取的数字,您可以使用
parse integer
(标准中)或
parse number
(库)。这比使用
read
要好得多,因为您必须防止恶意输入。@BRP从第一部分开始,它不能很好地工作,因为它打印数组的所有索引我只想打印索引与用户输入相等,第二部分的意思是“(格式t”~&~r)(1+数字)“当我尝试只打印数字而不添加一个数字时,为什么它不起作用!@Svante是的,但这遵循C#代码的形状,并接受理性等。我可能会使用read line,but@Ega它们都应该产生与原始程序相同的输出,只有第二个程序处理所有数字,而不仅仅是0-4。您可以查找格式通过拼出波浪号进行编码:“CLHS格式波浪号R”例如
(defun main ()
  (loop
     (fresh-line)
     (princ "Enter a number:")
     (finish-output)
     (let* ((*read-eval* nil)
            (number (read)))
       (format t "~&~r" (1+ number)))))