【问题标题】:LISP: read number from user and commpare with array indexLISP:从用户读取数字并与数组索引进行比较
【发布时间】:2015-07-24 02:08:36
【问题描述】:

大家好,我是函数式编程的新手,对我来说真的不清楚,任何人都可以帮助我吗? 我的问题只是为了了解编写函数式编程语言的理念,例如如何用 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());
                }
            }
        }
    }

【问题讨论】:

  • Common Lisp 不是函数式语言……但是,C# 也不是数字语言……更重要的是,到目前为止,您在 CL 中尝试过什么?你有什么问题?

标签: functional-programming lisp common-lisp


【解决方案1】:

Common 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# 示例的“形状”。

(defun main ()
  (loop
     (fresh-line)
     (princ "Enter a number:")
     (finish-output)
     (let* ((*read-eval* nil)
            (number (read)))
       (format t "~&~r" (1+ number)))))

【讨论】:

  • 如果你知道这是一个你想读的数字,你可以使用parse-integer(在标准中)或parse-number(一个库)。这比使用 read 要好得多,因为您必须防止恶意输入。
  • @BRP 从第一部分开始它不能完美工作,因为它打印所有索引 fo 数组我只想打印索引等于用户输入,第二部分是什么意思'(格式t "~&~r" (1+ number)' 为什么当我尝试只打印数字而不加一时它不起作用!
  • @Svante 是的,但这遵循 C# 代码的形状,并接受理性等。我可能会使用 read-line,但是
  • @Ega 这些应该都产生与原始程序相同的输出,只有第二个处理所有数字而不仅仅是 0-4。
  • 您可以通过拼出波浪号来查找格式代码:例如“CLHS FORMAT TILDE R”
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2012-07-06
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多