2017-01-05 53 views
0

我试图建立Clojure中的一个八进制处理函数处理,到目前为止,我有这样的:八进制数Clojure中

(defn octal [a] 
    (if (= 023 a) 
     (Integer/toOctalString a) 
     a)) 

在那里我有“023”我想有一些逻辑来代替它这检查一个数字是否以'0'开头。我知道开始 - 与?对于字符串,有没有一种使用数字的方法?

我试图这样做,因为如果我传递整数/ toOctalString一个整数没有0它传回一个更大的数字。例如。 2345变成4451.

谢谢

+1

那么'a'应该是一个整型?整数的源表示不是其运行时表示的一部分,因此检查“数字是否以'0'开始”是没有意义的。 –

+0

我的理解是,我写这个是为了理解如何为八进制数字创建错误处理,当目标是基数8时。例如,我希望能够将023更改为23,但不是23到27. – CS456

+1

当我说“它没有意义”时,我的意思是回答你问的问题的必要信息在运行时不存在,所以你所问的是不可能的。在运行时,'023'与'(Integer/parseInt“10011”2)'完全相同,'23'与'(Integer/parseInt“10111”2)'完全相同。您无法取回源代码中使用的表示法。 –

回答

1

看来read-string可以为你做到这一点:如果你想不带前缀八进制读取,你可以简单地传递之前,添加零

(read-string "023") 
; ==> 19 

(read-string "19") 
; ==> 19 

(defn octal->integer [s] 
    (read-string (str \0 s))) 

(octal->integer "23") 
; ==> 19 
0

输出当数字:

在b uilt在format功能做到这一点很好:

user> (format "%o" 19) 
"23" 
约一个数量当然不是什么

知道,如果它是在一个特定的格式原先规定,但如果你把它变成一个收集和存储与它一起的信息,无论是直接或者在元数据中,您可以跟踪这些信息。


至于阅读的数字而言:

Clojure的数字是八进制默认情况下,如果他们开始用前导零

只是一般的警告,clojure.core /读取字符串是完全不安全到在不受信任的输入上使用。如果不仔细管理,它将在读取时从字符串运行代码。

用户clojure.edn /读取字符串,而不是

它们都将读取一个八进制数给你就好了:

user> (clojure.edn/read-string "023") 
19 
user> (read-string "023") 
19 

而且clojure.edn /读取字符串将拒绝p0wn服务器:

user> (read-string "#=(println \"Pwning your server now\")") 
Pwning your server now 
nil 

user> (clojure.edn/read-string "#=(println \"Pwning your server now\")") 
RuntimeException No dispatch macro for: = clojure.lang.Util.runtimeException (Util.java:221) 

所以它的价值在使用clojure.edn对所有数据的习惯是它不是你编程的,实际上一部分米


PS:您可以设置一个动态变量来关闭读取字符串的reader-eval功能,并根据它是一个等待发生的事故。