Eu venho com isso:
(defn string-> inteiro [str & [base]] (Integer / parseInt str (se (nil? Base) 10 base))) (sequência-> inteiro "10") (string-> inteiro "FF" 16)
Mas deve ser uma maneira melhor de fazer isso.
Eu venho com isso:
(defn string-> inteiro [str & [base]] (Integer / parseInt str (se (nil? Base) 10 base))) (sequência-> inteiro "10") (string-> inteiro "FF" 16)
Mas deve ser uma maneira melhor de fazer isso.
Uma função pode ter várias assinaturas se as assinaturas diferirem em termos de área. Você pode usar isso para fornecer valores padrão.
(defn string->integer
([s] (string->integer s 10))
([s base] (Integer/parseInt s base)))
Observe que supor false
e nil
são considerados não-valores (if (nil? base) 10 base)
pode ser reduzido para (if base base 10)
ou além de (or base 10)
.
(recur s 10)
, usando emrecur
vez de repetir o nome da funçãostring->integer
. Isso tornaria mais fácil renomear a função no futuro. Alguém sabe alguma razão para não usarrecur
nessas situações?recur
só funciona na mesma aridade. se você tentou repetir acima, por exemplo:java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2, compiling:
(string->integer s 10)
)?Você também pode desestruturar
rest
argumentos como um mapa desde o Clojure 1.2 [ ref ]. Isso permite nomear e fornecer padrões para argumentos de função:Agora você pode ligar
ou
Você pode ver isso em ação aqui: https://github.com/Raynes/clavatar/blob/master/src/clavatar/core.clj (por exemplo)
fonte
Esta solução está mais próxima do espírito da solução original , mas marginalmente mais limpa
Um padrão semelhante que pode ser útil usa
or
combinado comlet
Embora neste caso seja mais detalhado, pode ser útil se você deseja ter padrões dependentes de outros valores de entrada . Por exemplo, considere a seguinte função:
Essa abordagem pode ser facilmente estendida para trabalhar com argumentos nomeados (como na solução de M. Gilliar) também:
Ou usando ainda mais uma fusão:
fonte
or
or
é diferente de:or
uma vezor
que não sabe a diferença denil
efalse
.Há outra abordagem que você pode considerar: funções parciais . Essas são sem dúvida uma maneira mais "funcional" e mais flexível de especificar valores padrão para funções.
Comece criando (se necessário) uma função que tenha o (s) parâmetro (s) que você deseja fornecer como padrão (s) como o (s) parâmetro (s) principal (s):
Isso é feito porque a versão do Clojure
partial
permite fornecer os valores "padrão" somente na ordem em que aparecem na definição da função. Uma vez que os parâmetros foram ordenados conforme desejado, você pode criar uma versão "padrão" da função usando apartial
função:Para fazer com que essa função seja chamada várias vezes, você pode colocá-la em uma var usando
def
:Você também pode criar um "padrão local" usando
let
:A abordagem da função parcial tem uma vantagem importante sobre as outras: o consumidor da função ainda pode decidir qual será o valor padrão em vez do produtor da função, sem precisar modificar a definição da função . Isso é ilustrado no exemplo
hex
em que decidi que a função padrãodecimal
não é o que eu quero.Outra vantagem dessa abordagem é que você pode atribuir à função padrão um nome diferente (decimal, hexadecimal etc.), que pode ser mais descritivo e / ou de escopo diferente (var, local). A função parcial também pode ser combinada com algumas das abordagens acima, se desejado:
(Observe que isso é um pouco diferente da resposta de Brian, pois a ordem dos parâmetros foi revertida pelas razões indicadas na parte superior desta resposta)
fonte
Você também pode acessar
(fnil)
https://clojuredocs.org/clojure.core/fnilfonte