Convert string to code in Scheme

会有一股神秘感。 提交于 2019-12-19 17:44:14

问题


How do I convert a string into the corresponding code in PLT Scheme (which does not contain the string->input-port method)? For example, I want to convert this string:

"(1 (0) 1 (0) 0)"

into this list:

'(1 (0) 1 (0) 0)

Is it possible to do this without opening a file?


回答1:


Scheme has procedure read for reading s-expressions from input port and you can convert a string to input stream with string->input-port. So, you can read a Scheme object from a string with

(read (string->input-port "(1 (0) 1 (0) 0)"))

I don't have Scheme installed, so I only read it from reference and didn't actually test it.




回答2:


From PLT Scheme manual:

(open-input-string string [name-v]) creates an input port that reads bytes from the UTF-8 encoding (see section 1.2.3) of string. The optional name-v argument is used as the name for the returned port; the default is 'string.




回答3:


From this similar question on comp.lang.scheme you can save the string to a file then read from it.

That might go something like this example code:

(let ((my-port (open-output-file "Foo")))
  (display "(1 (0) 1 (0) 0)" my-port)
  (close-output-port my-port))

(let* ((my-port (open-input-file "Foo"))
       (answer (read my-port)))
  (close-input-port my-port)
  answer)



回答4:


Many schemes have with-input-from-string str thunk that executes thunk in a context where str is the standard input port. For example in gambit scheme:

(with-input-from-string "(foo bar)" (lambda () (read)))

evaluates to:

(foo bar)

The lambda is necessary because a thunk should be a procedure taking no arguments.



来源:https://stackoverflow.com/questions/318952/convert-string-to-code-in-scheme

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!